24 비트 연산자 응용하기

C 언어의 자료형은 부호 있는 정수와 부호 없는 정수 두 가지가 있습니다. 두 자료형에 비트 연산을 했을 때 어떤 차이점이 있는지 알아보겠습니다. 또한, 비트 연산자를 응용한 플래그 처리 방법도 알아보겠습니다.

참고로 이제부터 설명할 부분은 비트 연산자를 응용하는 부분이라 내용이 어렵습니다. 지금은 내용을 모두 이해하지 않아도 되며 이런 응용 방법이 있다 정도면 알아두면 됩니다.

24.1 시프트 연산과 2의 거듭제곱 알아보기

시프트 연산자는 2의 거듭제곱인 숫자를 빠르게 구할 때 유용합니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

bitwise_shift_power_of_two.c

#include <stdio.h>
 
int main()
{
    unsigned char num1 = 1;    //   1: 0000 0001
 
    printf("%u\n", num1 << 1);    //   2: 0000 0010: 2
    printf("%u\n", num1 << 2);    //   4: 0000 0100: 22
    printf("%u\n", num1 << 3);    //   8: 0000 1000: 23
    printf("%u\n", num1 << 4);    //  16: 0001 0000: 24
    printf("%u\n", num1 << 5);    //  32: 0010 0000: 25
    printf("%u\n", num1 << 6);    //  64: 0100 0000: 26
    printf("%u\n", num1 << 7);    // 128: 1000 0000: 27

    return 0;
}

실행 결과

2
4
8
16
32
64
128

0000 0001을 왼쪽으로 한 번씩 이동하면 2의 거듭제곱으로 수가 늘어납니다. 즉, 비트의 각 자릿수는 2의 거듭제곱을 뜻하므로 비트의 이동 횟수는 지수(exponent)라 할 수 있습니다. 예를 들면 1 << 3은 23과 같습니다. 컴퓨터에서 2의 거듭제곱은 매우 광범위하게 쓰이므로 비트 연산자가 유용하게 사용됩니다.