22.4 비트 연산 후 할당하기

이번에는 비트 연산자와 할당 연산자를 함께 사용해보겠습니다.

  • a &= b
  • a |= b
  • a ^= b
  • a <<= b
  • a >>= b

bitwise_asign.c

#include <stdio.h> 

int main()
{
    unsigned char num1 = 4;    // 4: 0000 0100
    unsigned char num2 = 4;    // 4: 0000 0100
    unsigned char num3 = 4;    // 4: 0000 0100
    unsigned char num4 = 4;    // 4: 0000 0100
    unsigned char num5 = 4;    // 4: 0000 0100
 
    num1 &= 5;     // 5(0000 0101) AND 연산 후 할당
    num2 |= 2;     // 2(0000 0010) OR 연산 후 할당
    num3 ^= 3;     // 3(0000 0011) XOR 연산 후 할당
    num4 <<= 2;    // 비트를 왼쪽으로 2번 이동한 후 할당
    num5 >>= 2;    // 비트를 오른쪽으로 2번 이동한 후 할당
 
    printf("%u\n", num1);    //  4: 0000 0100: 100과 101을 비트 AND하면 100이 됨
    printf("%u\n", num2);    //  6: 0000 0110: 100과 010을 비트 OR하면 110이 됨
    printf("%u\n", num3);    //  7: 0000 0111: 100과 011을 비트 XOR하면 111이 됨
    printf("%u\n", num4);    // 16: 0001 0000: 100을 왼쪽으로 2번 이동하면 10000이 됨
    printf("%u\n", num5);    //  1: 0000 0001: 100을 오른쪽으로 2번 이동하면 1이 됨
 
    return 0;
}

실행 결과

4
6
7
16
1

각 자리 별로 10진수와 2진수를 적어놓았습니다. &=는 다른 값과 비트 AND 연산을 한 뒤 다시 자기 자신에게 할당한다는 뜻입니다. 다른 연산자도 마찬가지로 해당 연산을 수행한 뒤 다시 자기 자신에게 할당합니다. 여기서는 각 변수에 4가 들어있습니다.

num1 &= 50000 01000000 0101을 비트 AND 연산했을 때 1 & 11,0 & 00, 0 & 10이 나오고 이 값을 다시 할당해서 0000 0100이 됩니다.

0000 0100(4)
0000 0101(5)
_________ &
0000 0100(4)

num2 |= 20000 01000000 0010을 비트 OR 연산했을 때 1 | 01, 0 | 11, 0 | 00이 나오고 이 값을 다시 할당해서 0000 0110이 됩니다.

0000 0100(4)
0000 0010(2)
_________ |
0000 0110(6)

num3 ^= 30000 01000000 0011을 비트 XOR 연산했을 때 1 ^ 01, 0 ^ 11, 0 ^ 11이 나오고 이 값을 다시 할당해서 0000 0111이 됩니다.

0000 0100(4)
0000 0011(3)
_________ ^
0000 0111(7)

num4 <<= 20000 0100을 왼쪽으로 2번 이동한 뒤 다시 할당하여 0001 0000이 됩니다.

0000 0100(4)
_________ << 2
0001 0000(16)

num5 >>= 20000 0100을 오른쪽으로 2번 이동한 뒤 다시 할당하여 0000 0001이 됩니다.

0000 0100(4)
_________ >> 2
0000 0001(1)

즉, 기존에 들어있던 값은 사라지고 새로 연산한 값이 할당됩니다.

이 연산을 풀어보면 다음과 같습니다.

num1 = num1 & 5;     // 5(0000 0101) AND 연산 후 할당
num2 = num2 | 2;     // 2(0000 0010) OR 연산 후 할당
num3 = num3 ^ 3;     // 3(0000 0011) XOR 연산 후 할당
num4 = num4 << 2;    // 비트를 왼쪽으로 2번 이동한 후 할당
num5 = num5 >> 2;    // 비트를 오른쪽으로 2번 이동한 후 할당

출력 결과는 앞의 연산 결과와 같습니다. 즉, &=, |=, ^=, <<=, >>= 연산자는 반복되는 변수 부분을 생략하기 위해 사용합니다. 특히, 비트 연산에서 연산과 할당이 한꺼번에 이루어지는 연산자는 플래그를 켜거나 끌 때 유용하게 활용됩니다. 

지금까지 비트 연산을 배웠는데 2진수가 익숙하지 않아 내용이 어려웠을 겁니다. 지금은 모든 내용을 이해하지 않아도 되며 나중에 비트 연산이 필요할 때 다시 찾아보면 됩니다.