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

실습 7-6[A]                                                •완성 파일 chap07/BitSet.c
                     01  /* 비트 벡터에 의한 정수 집합 연산(소스) */
                     02  #include <stdio.h>
                     03  #include "BitSet.h"
                     04
                     05  /*--- 집합 s에 n이 들어 있는지 확인 ---*/
                     06  int IsMember (BitSet s, int n)
                     07  {
                     08    return s & SetOf(n);
                     09  }
                     10
                     11  /*--- 집합 s에 n을 추가 ---*/
                     12  void Add (BitSet *s, int n)
                     13  {
                     14    *s |= SetOf(n);
                     15  }
                     16                                                     (실습 7-6[B]에서 계속)



                   원소가 들어 있는지 확인하는 IsMember 함수

                   IsMember 함수는 집합 s에 n 값이 들어 있는지 확인하는 함수입니다. 집합 s에 n 값이 들어
                   있는지 확인하는 방법은 집합 s 비트 벡터와 {n} 비트 벡터를 논리곱(AND) 연산하면 됩니다.
                   그림 7-14에 이 과정을 나타냈습니다.  a 처럼 집합에 n이 들어 있는 경우 비트 벡터 s와 n으
                   로 논리곱 연산을 하면 {n}이 나옵니다. 반대의 경우로  b 처럼 집합에 n이 들어 있지 않은 경

                   우 논리곱 연산을 하면 공집합이 나옵니다. 다시 말해 집합 s에 n 값이 없다면 모든 비트가 0
                   인 배열이 나옵니다. C 언어에서 1은 참, 0은 거짓입니다. 따라서 다음과 같이 IsMember 함
                   수를 그대로 if문에 사용할 수 있습니다.


                    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 0 0 0 0 0 0         0 0      0 0 0 0 0 0 0 0 0 0
                              논리곱(AND) 연산을 통해 이 비트만                논리곱(AND) 연산을 통해 모든
                              1이 됩니다.                              비트가 0이 됩니다.
                              즉, n은 s 안에 들어 있습니다.                  즉, n은 s 안에 들어 있지 않습니다.

                                     [그림 7-14] IsMember 함수로 n이 있는지 확인하는 과정


                   294   C 알고리즘
   289   290   291   292   293   294   295   296   297   298   299