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

if(IsMember(&s, n)) /* 집합 s에 n 값이 들어 있는지 확인할 때 작성하는 if문 */



                        원소를 추가하는 Add 함수

                        Add 함수는 집합 s에 n을 추가하는 함수입니다. 집합 s에 n을 추가하는 방법은 그림 7-15처
                        럼 집합 s 비트 벡터와 SetOf(n)으로 얻은 비트 벡터를 논리합(OR) 연산하면 됩니다.  a 처럼
                        집합에 n이 이미 들어 있는 경우에는 논리합 연산을 하더라도 집합 s는 업데이트되지 않습니
                        다.  b 처럼 집합에 n이 없다면 논리합 연산에 의해 n에 대응하는 비트가 0에서 1로 변경됩니

                        다(원소가 추가됩니다).

                        a  집합 {1, 3, 5, 6}에 6을 추가합니다.        b  집합 {1, 3, 5, 6}에 4를 추가합니다.


                                   31 30      9  8  7  6   5   4  3   2  1   0   31 30      9  8  7  6   5   4  3   2  1   0
                          s        0 0      0 0 0 1 1 0 1 0 1 0  s       0 0      0 0 0 1 1 0 1 0 1 0

                          SetOf(n)   0 0      0 0 0 1 0 0 0 0 0 0  SetOf(n)   0 0      0 0 0 0 0 1 0 0 0 0
                        |                                    |
                                   0 0      0 0 0 1 1 0 1 0 1 0          0 0      0 0 0 1 1 1 1 0 1 0

                                   논리합 연산을 해도 원래 집합의 상                  논리합 연산을 통해 4에 해당하는
                                   태를 유지합니다.                            비트가 1로 바뀝니다.
                                   원래의 n이 유지됩니다.                        n 값이 추가되었습니다.

                                              [그림 7-15] Add 함수로 n을 추가하는 과정


                         실습 7-6[B]                                                •완성 파일 chap07/BitSet.c
                         01  /*--- 집합 s에서 n을 삭제 ---*/
                         02  void Remove (BitSet *s, int n)
                         03  {
                         04    *s &= ~SetOf(n);
                         05  }
                         06
                         07  /*--- 집합 s의 원소 개수를 반환 ---*/
                         08  int Size (BitSet s)
                         09  {
                         10    int n = 0;
                         11    for(; s != BitSetNull; n++)
                         12      s &= s - 1;
                         13    return n;
                         14  }
                         15




                                                                                          07•집합  295
   290   291   292   293   294   295   296   297   298   299   300