// 작업 중 입니다....

이 파트를 완전히 이해하기 위해서는 2 의 보수 표현법에 대한 공부가 필요합니다.

1. bit 연산자

동기부여) 부분 집합형 퇴각검색(backtracking)을 재귀를 이용하지 않고 비트 연산으로 구현한 소스 입니다.
#include 

int main () 
{
    int i, j, sum;
    int B;
                
    int buckets[3]={6,2,9};

    B = 3;

    for (i = 0; i < 1 << B ; i++) {
        sum = 0;
        for (j = 0; j < B; j++)
            if (i & (1 << j) ) sum += buckets[j];
        printf("%d\n",sum);
    
    }
    return 0;
}
/*
10진수 2진수 합
----------------
  0     000  0  
  1     001  6  
  2     010  2  
  3     011  8  
  4     100  9  
  5     101 15 
  6     110 11 
  7     111 17 
*/
비트 연산자를 간단히 공부 한 후 어떻게 비트 연산으로 가능한지 알아 보겠습니다.

1) and 연산자 &

모두가 1 일 때 1 인 연산자. 즉

#include <stdio.h>

int main()
{
   int a;

   a=172;
   printf("%d",a & 56); // 결과 : 40
}
1 로 비트 연산을 가하면 원래의 상태가 그대로 유지가 되고 , 0 을 가하면 원래의 상태에 관계없이 0 으로 클리어(mask off)가 됩니다.

(예제1) a 가 짝수인지 홀수인지를 판단하는 프로그램

#include <stdio.h>

int main()
{
   int a;

   scanf("%d",&a);
   if ( a & 1 ) { // 2 진수로 바꿀 때 첫 비트가 1 이면 홀수 아니면 짝수 
      printf("홀수");
   }else {
      printf("짝수");
   }
}

(예제2) a 의 제일 오른쪽에 나오는 1 의 값을 가져옴.

#include <stdio.h>

int main()
{
   int a;

   a=172;
   printf("%d",a&-a); //결과는 4
}
(예제3) 2n 인지 check.
#include <stdio.h>

int main()
{
   int a;

   scanf("%d",&a);
   if ( a & (a-1) == 0 ){
      printf("yes");
   }else {
      printf("no");
   }
}

2) or 연산자 |

a 의 2 , 3 , 4 번 비트를 1 0 1 나머지는 현재 상태로 유지하고 싶으면 특정비트를 어떤 값으로 세팅할 때(selective set) 사용합니다.

3) x-or연산자 ^

서로 상태가 다를 때 1 입니다. 1 의 개수가 홀수 개 일 때라 생각해도 됩니다.

이 연산자는 특정 비트를 반전(selective complement) 시킬 때 많이 사용합니다.

특정 비트에 1 로 x-or 을 하면 0 이면 1 이되고 , 1 이면 0 으로 됩니다. not 연산자와 같이 움직입니다.

4) not 연산자 ~

0 을 1 로 , 1 을 0 으로 바꿉니다.

5) shift 연산자

오른쪽 shift 연산은 두가지가 있습니다. logical 오른쪽 shift 는 새로 첨가되는 비트가 0 이고 arithmetic 오른쪽 shift 는 새로 첨가되는 비트가 1 입니다.

(1) right shift >>

(2) left shift <<

2. stl bitset

3. 참고 자료

* graphics.stanford.edu/~seander/bithacks.html
출처:dovelet

[질/답]
[홈으로]  [뒤 로]
[푼 후(0)]