C/C++/C

[C언어] 비트단위연산자

꿀꿀이냐옹이 2009. 7. 21. 14:07
반응형

1. & 연산자 ( 비트단위 AND )
&연산은 두 개의 비트가 모두 1일때 1을 반환하는 연산이다.

0 & 0  →  0을 반환
0 & 1  →  0을 반환
1 & 0  →  0을 반환
1 & 1  →  1을 반환

예제코드)
int main()
{
      int a = 15;
      int b = 20;
      int c = a&b;

      printf( "AND연산 결과 : %d", c );      // 출력결과 4
}

  00000000 00000000 00000000 00001111    // 15
& 00000000 00000000 00000000 00010100    // 20
-------------------------------------
  00000000 00000000 00000000 00000100    // 4       비트 연산 결과


2. | 연산자 ( 비트단위 OR )
|연산은 두 개의 비트 중 하나라도 1이면 1을 반환하는 연산이다.

0 | 0  →  0을 반환
0 | 1  →  1을 반환
1 | 0  →  1을 반환
1 | 1  →  1을 반환

예제코드)
int main()
{
       int a = 15;
       int b = 20;
       int c = a|b;

       printf( "AND연산 결과 : %d", c );    // 출력결과 31
}

      00000000 00000000 00000000 00001111
|(OR) 00000000 00000000 00000000 00010100
------------------------------------------
      00000000 00000000 00000000 00011111     // 31


3.^연산자( 비트단위 XOR )
^연산은 두 개의 비트가 서로 다를 경우에 1을 반환하는 연산이다.

0 ^ 0  →  0을 반환
0 ^ 1  →  1을 반환
1 ^ 0  →  1을 반환
1 ^ 1  →  0을 반환

예제코드)
int main()
{
       int a = 15;
       int b = 20;
       int c = a^b;

       printf( "XOR연산 결과 : %d", c );    // 출력결과 27
}

       00000000 00000000 00000000 00001111
^(XOR) 00000000 00000000 00000000 00010100
------------------------------------------
       00000000 00000000 00000000 00011011     // 27


4. ~연산자 ( 비트단위 NOT )
보통은 보수 연산자라고 해서 비트를 반전시킨다.

~0   →  1을 반환
~1   →  0을 반환

int main()
{
      int a = 15;
      int b = ~a;

      printf("NOT연산 결과 : %d", b);    // 출력결과 -16
}

        00000000 00000000 00000000 00001111
--------------------------------------------
~(NOT)  11111111 11111111 11111111 11110000     // -16


5. <<,>>연산자 (비트단위 shift)
비트를 이동시키는 연산자에는 두 가지가있다. "<<" 와 ">>"
 ■ << 연산자 : 왼쪽쉬프트 연산
a << b  →  a의 비트들을 b칸씩 왼쪽으로 이동한 값을 반환
8 << 2  →  8의 비트들을 2칸씩 왼쪽으로 이동한 값을 반환

int main()
{
      int a = 15;
      int b = a<<2;

      printf("<<2 연산 결과 : %d ", b);     // 출력결과 60
}

      00000000 00000000 00000000 00001111
     -------------------------------------   <<2로 연산
   00
00000000 00000000 00000000 00111100
   ↑                                  ↑
 
앞으로 밀려난 비트는 삭제            추가되는 비트는 무조건 0

*** 비트는 자리가 앞쪽으로 한칸씩 밀려날때마다 값이 두 배가 된다.

ㄴㅁㅇㄻㄴㄹ
 ■ >> 연산자 : 오른쪽 쉬프트 연산
a >> b  →  a의 비트들을 b칸씩 오른쪽으로 이동한 값을 반환
8 >> 2  →  8의 비트들을 2칸씩 오른쪽으로 이동한 값을 반환

a = -10;
b = a>>2;

    11111111 11110110   // -10 보기의 편의를 위해 앞의 0은 없앴다.
   --------------------  >>2의 연산  
    00
11111111 111101   // case 1
    1111111111 111101   // case 2

*** 변수의 비트를 오른쪽으로 옮기면 왼쪽의 빈자리가 생기게 되는데 시스템의 따라 값이 달라진다. 음의 값을 유지하기 위해 1을 채우기도하고 양수의 >>연산과 마찬가지로 0을 채우기도 한다.
반응형