2015년 5월 20일 수요일

C/C++의 bitwise-and 연산

 두 피연산자의 and연산은 같은 자리의 비트끼리 전체 비트들에 대해서 수행하며 [표 1]에 AND연산을 정리하였다. 두 비트가 모두 1이어야 1이고 하나라도 0이라면 0이다.

[표 1] 비트-and 연산
x
y
x▪y
0
0
0
0
1
0
1
0
0
1
1
1

예를 들면 다음과 같다.

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
=
0
0
1
1
0
0
1
0
(0x32)

이 그림에서 보듯이 (unsigned) char형 변수는 보통 최하위 비트를 0번으로 해서 1번, 2번, ...  , 7번 비트까지 있으며 각각 b0, b1, b2, … , b7이라고 표시한다. 변수의 가장 하위 비트를 LSB (least significant bit), 가장 상위비트를 MSB (most significant bit)라고 한다. 이 경우는 8비트 연산이지만 16비트(short)나 32비트(long) 연산도 원리는 동일하다. 즉, 같은 위치의 비트끼리 and연산을 취하는 것이다.

 다음과 같은 경우에도 and연산이 사용된다. 만약 어떤 데이터 값에서 상위 4비트는 그대로 유지하고 하위 4비트만을 0으로 만들고 싶다면 어떻게 해야 할까.

unsigned char uca = 0xBA;
uca &= 0xF0;




b7
b6
b5
b4
b3
b2
b1
b0


uca
=
1
0
1
1
1
0
1
0
(0xBA)
&
0xF0
=
1
1
1
1
0
0
0
0
(0xF0)

uca
=
1
0
1
1
0
0
0
0
(0xB0)

위의 예에서 보면 0xF0(=0b11110000)과 and연산을 취하면 그러한 동작이 일어남을 알 수 있다. 그 결과로 uca변수에는 0xB0가 남는다. 즉 상위 4비트는 그대로 유지하면서 하위 4비트는 0으로 바뀐다. 이러한 연산을 마스킹(masking)이라고 한다.


댓글 없음:

댓글 쓰기