비트 xor 연산자(^)는 두 피연산자의 같은 위치의 비트끼리 xor 연산을 수행한다. 두 비트의 xor 연산은 두 비트가 서로 다른 경우에는 1, 같은 경우는 0이다. 그 진리표는 다음 표와 같다.
[표 1] 비트 xor 연산
x | y | x⊗y |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
두 비트의 연산은 이해하기 쉬우나 세 개 이상의 비트들에 대해서 xor 연산을 수행하면 결과가 어떻게 될지 예측하기는 쉽지 않다. 다음 표에 세 비트의 xor 결과를 기록하였다.
[표 2] 세 비트의 xor 연산
x | y | z | x⊗y⊗z |
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 |
0 | 1 | 1 | 0 |
1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 0 |
1 | 1 | 1 | 1 |
일반적으로 n개 비트들의 xor 결과는 1의 개수가 홀수 개이면 1, 짝수 개이면 0이다. 위의 두 표에서도 이 규칙이 적용되므로 확인해 보기 바란다.
다음 예제로 xor 연산 결과를 살펴보자.
unsigned char ucX = 0x3a, ucY = 0xb2, uCZ ;ucZ = ucX ^ ucY; |
이제 변수 ucZ에 저장되는 값은 다음과 같이 계산된다.
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | ||||
ucX | = | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | (0x3a) | |
^ | ucY | = | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | (0xb2) |
ucZ | = | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | (0x88) |
이 bit-xor 연산을 이용하면 원하는 비트를 반전시키는데(toggle) 응용할 수 있다. 만약 어떤 데이터에서 상위 4비트는 그대로 유지하고 하위 4비트만을 반전시키고자 하면 다음과 같이 한다.
unsigned char uca = 0xba;uca ^= 0x0f; |
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | ||||
uca | = | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | (0xba) | |
^ | 0x0f | = | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | (0x0f) |
uca | = | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | (0xb5) |
위의 예에서 보면 0x0f(=0b00001111)과 xor연산을 취하면 하위 4비트만 반전됨을 알 수 있다. 상위 4비트는 원래 값을 유지한다. 그 결과로 uca변수에는 0xb5가 남는다.
C++ 강좌 전체 목록 >>>
'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글
C/C++의 비트 이동(shift)연산 (<<, >>) (0) | 2015.05.20 |
---|---|
C/C++의 bitwise-not 연산 (~) (0) | 2015.05.20 |
C/C++의 bitwise-or 연산자 (|) (0) | 2015.05.20 |
C/C++의 bitwise-and 연산 (0) | 2015.05.20 |
C/C++의 비트 연산자의 종류 (0) | 2015.05.20 |