23.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번 이동한 후 할당
출력 결과는 앞의 연산 결과와 같습니다. 즉, &=, |=, ^=, <<=, >>= 연산자는 반복되는 변수 부분을 생략하기 위해 사용합니다. 특히, 비트 연산에서 연산과 할당이 한꺼번에 이루어지는 연산자는 플래그를 켜거나 끌 때 유용하게 활용됩니다. 플래그에 대해서는 Unit 24 비트 연산자 응용하기'에서 자세히 설명하겠습니다.
지금까지 비트 연산을 배웠는데 2진수가 익숙하지 않아 내용이 어려웠을 겁니다. 지금은 모든 내용을 이해하지 않아도 되며 나중에 비트 연산이 필요할 때 다시 찾아보면 됩니다.