비트연산
1) 10진수를 2진수로 변환
예를들면 “13”을 2진수로 변환하면
2 | 13
   ____
2 | 6   --- 1 <- d[1]
   ----
2 | 3   --- 0 <- d[2]
   ----
2 | 1   --- 1 <- d[3]
   ----
    0   --- 1 <-d[4]
그래서 “13”은 d[4]부터 d[1] 역순으로 출력하면 “1101”입니다.
2) 2진수를 10진수로 변환
2진수 1101를 10진수로 변환하면
1  1  0  1
x  x  x  x
8  4  2  1     <- 자리별 가중치
----------
8+ 4+ 0+ 1 => 13 <-10진수로 표현
3) & 연산
비트가 모두 1이면 1을 반환함. (and 연산)
4) | 연산
비트가 모두 0이면 0을 반환함. (or 연산)
a
b
a&b
0
0
0
0
1
0
1
0
0
1
1
1
a
b
a|b
0
0
0
0
1
1
1
0
1
1
1
1
5) ^ 연산
비트가 서로 다르면 1을 반환함. (xor 연산)
6) ! 연산
비트를 1이면 0으로, 0이면 1로 반전시킴. (not 연산)
7) >> 연산
>>지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. 
예를 들면 6을 “>>” 연산하면
110 << 1 => 011 이 됩니다.
그리고 3이 됩니다.
#include<stdio.h>
int main()
{
printf("%d\n", 6>>1);
return 0;
}
a
b
a^b
0
0
0
0
1
1
1
0
1
1
1
0
a
!a
0
1
1
0
8) << 연산
<<지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴.
예를 들면 3을 “<<” 연산하면
011 << 1  => 110 이 됩니다.
그리고 6이 됩니다.
#include<stdio.h>
int main()
{
printf("%d\n", 3<<1);
return 0;
}
문제) 다음 코드를 실행 후 결과는?
1.
#include<stdio.h>
int main()
{
int a,b,c;
a=13; b=7;c=12;
if(a>b)a=b;
if(c>a)c=a;
printf("%d %d %d\n",a,b,c);
return 0;
}
a
b
c
2. 
#include<stdio.h>
int main()
{
int k, p, q;
k=13; p=30; q=11;
k++;
k*=2;
if(k<p)k=p;
k--;
k/=2;
if(k>q)k=q;
printf("%d\n",q);
return 0;
}
k
p
q
3.
#include<stdio.h>
int main()
{
int a,b,c;
a=12; b=15;c=21;
if(a&b)b=a&b;
b=b&5;
c=c|2;
printf("%d %d %d\n",a,b,c);
return 0;
}
a
b
c
4.
#include<stdio.h>
int main()
{
int a,b,c;
a=1; b=2; c=3;
a=a & 4 | 3;
b=b | 2 & 5;
c=c && 0;
printf("%d %d %d\n",a,b,c);
return 0;
}
a
b
c
5.
#include<stdio.h>
int main()
{
int a,b,c;
a=1; b=2; c=3;
a=a&0|2;
b=b|0&5;
c=c||1;
printf("%d %d %d\n",a,b,c);
return 0;
}
a
b
c
6.
#include<stdio.h>
int main()
{
int a, b, c;
a=12;b=7;c=5;
a=a >> 2;
b=b << 4;
c=c<<1 | 5;
printf("%d %d %d\n",a,b,c);
return 0;
}
7.
#include<stdio.h>
int main()
{
int a, b, c;
a=12;b=0;c=5;
a= !a;
b= !b;
c= !c;
printf("%d %d %d\n",a,b,c);
return 0;
}
a
b
c
a
b
c
8.
#include<stdio.h>
int main()
{
int a,b=0,c,d=0;
a=12; c=23;c=17;
if(a>c && a>c)d=15;
printf("%d %d %d %d\n",a,b,c,d);
return 0;
}
9.
#include<stdio.h>
int main()
{
int a,i;
a=7;
for(i=1; i<=3; i++){
a = a<<i;
}
printf("%d\n",i);
return 0;
}
a
b
c
d
i
a=
a<<i
10.
#include<stdio.h>
int main()
{
int a,i,c=0;
a=7;
for(i=1; i<=3; i++){
a = a^i;
c=c+a;
}
printf("%d %d %d\n",i,a,c);
return 0;
}
11.
#include<stdio.h>
#include<conio.h>
int main()
{
  int a,b,c;
  a=7; b=8;
  a = a^b;
  printf("%d %d %d\n",c,a,b); getch();
  c = a; 
  printf("%d %d %d\n",c,a,b); getch();
  b = a^b;
  printf("%d %d %d\n",c,a,b); getch();
  a = a^b;
  printf("%d %d %d\n",c,a,b); getch();
  return 0;
}
12.
#include<stdio.h>
#include<conio.h>
int main()
{
  int a[10]={3456, 7, 8976, 54, 53, 456, 7865, 45, 6734, 53};
  int i, b, cnt =0;
  for(i=0; i<10; i++){
    b = (a[i]&1) | (a[i] & 2);
    if(b==0)cnt++;
    printf("%d %d\n",a[i],cnt); getch();
  }
  printf("%d\n",cnt);
  return 0;
}
13.
#include<stdio.h>
int main()
{
  int n=2014, c=0;
  while(n>0){
    c += !(n&1);
    n = n >> 1;
  }
  printf("%d\n",c);
  return 0;
}
14.
#include<stdio.h>
int main()
{
  int a,i;
  a=2014;
  for(i=0; i<4; i++){
    a |=(a >> (1 << i));
  }
  a++;
  printf("%d\n",a);
  return 0;
}
15.
#include<stdio.h>
int main()
{
  int n=2015, c=0;
  while(n>0){
    c += (n & 3);
    n = n & (n-1);
  }
  printf("%d\n", c);
  return 0;
}
16. 두 수 더하기
#include<stdio.h>
int main()
{
int x,y,z;
x=12; y=23;
while(y){
z=x&y;
x=x^y;
y=z<<1;
}
printf("%d\n",x);
return 0;
}
17. 10진수를 2진수로 변환
#include<stdio.h>
int main()
{
int i, n, p;
n =15;
for(i=10; i>=0; i--){
p = (n>>i) & 1;
printf("%d",p);
}
return 0;
}
18. 홀수와 짝수
#include<stdio.h>
int main()
{
int n, p;
n= 18;
if( !(n&1) ) printf("o");
else printf("x");
return 0;
}
19. 교환
#include<stdio.h>
int main()
{
int a,b;
a=32; b=12;
a=a^b;
b=a^b;
a=a^b;
printf("%d %d\n",a,b);
return 0;
}
20. 큰수 - 작은수
#include<stdio.h>
int main()
{
int x,y,z;
x=23; y=12;
y= ~y;
while(y){
z=x&y;
x=x^y;
y=z<<1;
}
y=1;
while(y){
z=x&y;
x=x^y;
y=z<<1;
}
printf("%d\n",x);
return 0;
}
21.
#include<stdio.h>
int main()
{
printf("%d\n", 0b00100);
printf("%d\n", 0x00100);
printf("%x\n", 13);
printf("%o\n", 13);
printf("%d\n", 13);
return 0;
}
22.
입력받은 두 수를 곱하기 한 결과를 출력하는 프로그램을 작성하시
오! (반드시 비트 연산자로 연산하는 프로그램을 작성하시오!)
23. 
두 수(a, b)를 입력받아 곱하기한 후 그 결과(k)를 2진수로 표현하
였을 때 가장 오른쪽에서 시작하는 연속된 수의 개수(c)를 출력하
는 프로그램을 작성하시오! 정답(k)이 짝수이면 0의 연속되는 개수
(c), 홀수이면 1의 연속되는 개수(c)를 출력하시오! (반드시 비트 연
산자로 연산하는 프로그램을 작성하시오!)
24. 
자연수 1부터 n(n<=100,000)까지 그 자연수들 중 2진수로 표현하
였을 때 연속되는 1의 개수가 최대가 되는 자연수(k)를 출력하시
오!(비트 연산자가 포함하여 연산하는 프로그램을 작성하시오!)
25. 
자연수 두 수(a, b)를 입력받아 두 수를 2진수로 표현하였을 때 a
를 b와 같은 수를 만들려고 한다. 교환 작업의 최소 횟수를 구하여
라! 단, 반드시 인접한 두 개의 비트를 함께 교환해야 한다. 예를 
들면 “0110101”에서 왼쪽에서 두 번째 비트 ‘1’를 ‘0’으로 교환하
려면 서번째 비트 ‘1’도 함께 교환이 된다. 그래서 “0000101”이 된
다. 그리고 마지막 가장 오른쪽 비트는 교환 작업으로 인접한 비트
에 영향을 주지 않는다.(반드시 비트 연산자로 연산하는 프로그램을 
작성하시오!)
26.
어떤 자연수(a)가 주어진다. 이 때 0부터 b가 되기 위해 1씩 증가
한다. 자연수(a)를 2진수(8bit)로 표현하면 비트가 계속 변할 것이
다. 계속 변화는 비트의 개수를 구하시오! 예를 들면 자연수(a)가 3
이라고 하면 00000000-> 00000001 ->00000010 ->00000011 총 
4번 변한다. 단, 자연수(a)의 범위는 255 이하이다. (반드시 비트연
산자로 연산하는 프로그램을 작성하시오!)
위 문제들은 한국정보올림피아드(KOI)대회 기출문제를 참고하여 재
구성하였습니다.
수고하셨습니다.