2015년 5월 20일 수요일

C/C++의 bitwise-or 연산자 (|)

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

[표 1] 비트 or 연산
x
y
x+y
0
0
0
0
1
1
1
0
1
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
=
1
0
1
1
1
0
1
0
(0xba)

이 결과를 보면 같은 위치의 비트끼리 bit-or 연산을 취한 결과가 얻어진다는 것을 알 수 있다.

 여기서 소개한 bitwise-or 연산자는 특정 비트를 강제로 1로 만들고 싶을 때도 많이 사용된다. 예를 들어 ucm변수가 1바이트값 0x2A라고 했을 때 3번, 4번, 7번 비트만 1로 강제로 만들고 싶다면 다음과 같이 하면 된다.

unsigned char ucm = 0x2A;
ucm |= 0x98;

여기서 0x98은 이진수로 0b10011000 이고 3번, 5번, 7번 비트만 1, 나머지는 0인 수이다. 이것과 ucm을 or 연산을 한 결과는 3번, 5번, 7번 비트만 무조건 1로 만들고 나머지는 그대로 놔둔 수를 얻게 된다.




b7
b6
b5
b4
b3
b2
b1
b0


ucm
=
0
0
1
0
1
0
1
0
(0x2A)
|
0x98
=
1
0
0
1
1
0
0
0
(0x98)

ucm
=
1
0
1
1
1
0
1
0
(0xBA)

이렇게 특정한 비트를 1로 강제로 변환시키는 연산도 마스킹(masking)이라고 한다.


댓글 없음:

댓글 쓰기