22.3 시프트 연산자 사용하기

C 언어에서 비트의 논리 연산뿐만 아니라 각 자리를 이동시킬 수도 있습니다. 이번에는 비트의 자리를 이동시켜 보겠습니다.

  • a << b
  • a >> b

bitwise_shift_operator.c

#include <stdio.h>
 
int main()
{
    unsigned char num1 = 3;     //  3: 0000 0011
    unsigned char num2 = 24;    // 24: 0001 1000
 
    printf("%u\n", num1 << 3);  // 24: 0001 1000: num1의 비트 값을 왼쪽으로 3번 이동
    printf("%u\n", num2 >> 2);  //  6: 0000 0110: num2의 비트 값을 오른쪽으로 2번 이동
 
    return 0;
}

실행 결과

24
6

시프트 연산자를 사용하여 각 변수의 비트를 지정한 횟수대로 이동하였습니다. 다음은 시프트 연산을 하는 방법이며 << 연산자를 예로 들었습니다.

그림 22‑3 시프트 연산

시프트 연산은 변수 << 이동할 비트 수 또는 변수 >> 이동할 비트 수 형식으로 사용합니다. 즉 지정한 횟수대로 비트를 이동시키며 모자라는 공간은 0으로 채웁니다. 연산자 모양 그대로 <<는 왼쪽, >>는 오른쪽 방향입니다.

num1 << 30000 0011을 왼쪽으로 3번 이동하므로 0001 1000이 되고, 10진수로 24입니다.

0000 0011(3)
_________ << 3
0001 1000(24)

num2 >> 20001 1000이 오른쪽으로 2번 이동하므로 0000 0110이 되고, 10진수로 6입니다.

0001 1000(24)
_________ >> 2
0000 0110(6)

3 << 3은 3 * 23과 같으므로 24가 되고, 24 >> 2는 24 / 22과 같으므로 6이 됩니다. 즉, 시프트 연산 <<은 2의 거듭제곱을 곱하기, >>은 2의 거듭제곱을 나누기입니다.