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 &= 5는 0000 0100과 0000 0101을 비트 AND 연산했을 때 1 & 1은 1,0 & 0은 0, 0 & 1은 0이 나오고 이 값을 다시 할당해서 0000 0100이 됩니다.
0000 0100(4) 0000 0101(5) _________ & 0000 0100(4)
num2 |= 2는 0000 0100과 0000 0010을 비트 OR 연산했을 때 1 | 0은 1, 0 | 1은 1, 0 | 0은 0이 나오고 이 값을 다시 할당해서 0000 0110이 됩니다.
0000 0100(4) 0000 0010(2) _________ | 0000 0110(6)
num3 ^= 3은 0000 0100과 0000 0011을 비트 XOR 연산했을 때 1 ^ 0은 1, 0 ^ 1은 1, 0 ^ 1은 1이 나오고 이 값을 다시 할당해서 0000 0111이 됩니다.
0000 0100(4) 0000 0011(3) _________ ^ 0000 0111(7)
num4 <<= 2는 0000 0100을 왼쪽으로 2번 이동한 뒤 다시 할당하여 0001 0000이 됩니다.
0000 0100(4) _________ << 2 0001 0000(16)
num5 >>= 2는 0000 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진수가 익숙하지 않아 내용이 어려웠을 겁니다. 지금은 모든 내용을 이해하지 않아도 되며 나중에 비트 연산이 필요할 때 다시 찾아보면 됩니다.