#includeint 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 일 때 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"); } }
a 의 2 , 3 , 4 번 비트를 1 0 1 나머지는 현재 상태로 유지하고 싶으면특정비트를 어떤 값으로 세팅할 때(selective set) 사용합니다.
- 먼저 2 , 3 , 4 번 비트를 and 연산자로 클리어 합니다. 나머지는 그대로 a = a&11111....10001
- 다음 2, 3 ,4 번 비트를 1 0 1 으로 or 연산을 취합니다. a = a|00000000001010
서로 상태가 다를 때 1 입니다. 1 의 개수가 홀수 개 일 때라 생각해도 됩니다.이 연산자는 특정 비트를 반전(selective complement) 시킬 때 많이 사용합니다.
특정 비트에 1 로 x-or 을 하면 0 이면 1 이되고 , 1 이면 0 으로 됩니다. not 연산자와 같이 움직입니다.
0 을 1 로 , 1 을 0 으로 바꿉니다.
오른쪽 shift 연산은 두가지가 있습니다.logical 오른쪽 shift 는 새로 첨가되는 비트가 0 이고 arithmetic 오른쪽 shift 는 새로 첨가되는 비트가 1 입니다.
- 부호를 고려하지 않는 논리 쉬프트(logical shift) ,
- 부호를 고려한 산술 쉬프트(arithmetic shift)
(1) right shift >>
(2) left shift <<
출처:dovelet