2015년 5월 20일 수요일

C/C++의 bitwise-xor 연산 (^)

 비트 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가 남는다.


댓글 없음:

댓글 쓰기