비트 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++ 강좌 전체 목록 >>>
댓글 없음:
댓글 쓰기