Page 299 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 299

차집합을 구하는 방법

                        집합 s1과 s2의 차집합은 보수 연산자 ~와 비트 단위의 논리곱 연산자 &를 조합해 구할 수 있
                        습니다.


                         s1 & ~s2      /* 집합 s1과 집합 s2의 차집합 */




                        a  집합 {1, 3, 5, 6}에서 {1, 3, 4}를 뺍니다.  b  집합 {1, 3, 5, 6}에서 {2, 4, 7}을 뺍니다.
                                    31 30      9  8  7  6   5   4  3   2  1   0   31 30      9  8  7  6   5   4  3   2  1   0
                               s1   0 0      0 0 0 1 1 0 1 0 1 0    s1   0 0      0 0 0 1 1 0 1 0 1 0

                               ~s2   1 1      1 1 1 1 1 0 0 1 0 1   ~s2   1 1      1 1 0 1 1 0 1 0 1 1
                           &                                     &

                                    0 0      0 0 0 1 1 0 0 0 0 0         0 0      0 0 0 1 1 0 1 0 1 0
                                   차집합 {5, 6}을 얻었습니다.                   차집합 {1, 3, 5, 6}을 얻었습니다.
                                              [그림 7-20] 두 집합의 차집합을 구하는 과정


                        실습 7-7은 두 집합 s1과 s2을 사용해 대화형으로 다양한 집합 연산을 수행하는 프로그램입
                        니다.                                    이 프로그램의 컴파일에는 BitSet.h, BitSet.c가 필요합니다.


                          실습 7-7                                               •완성 파일 chap07/BitSetTest.c

                         01  /* 비트 벡터로 정수 집합 표현 */
                         02  #include <stdio.h>
                         03  #include "BitSet.h"
                         04
                         05  enum { ADD, RMV, SCH };
                         06
                         07  /*--- 데이터 입력 ---*/
                         08  int scan_data(int sw)
                         09  {
                         10     int data;
                         11     switch(sw) {
                         12       case ADD : printf("추가할 데이터 : "); break;
                         13       case RMV : printf("삭제할 데이터 : "); break;
                         14       case SCH : printf("검색할 데이터 : "); break;
                         15     }
                         16     scanf("%d", &data);
                         17     return data;





                                                                                          07•집합  299
   294   295   296   297   298   299   300   301   302   303   304