공부하자/C언어

C언어 문법 공부 6장 [비트별 연산자]

YoBot 2016. 11. 20. 01:31

3. 비트별 연산자


비트별 연산자는 비트단위 연산을 할때 쓰이는 연산자 입니다.

먼저 비트별 연산자의 종류를 알아보죠.

비트별 연산자에는 다음과 같은 것 들이 있습니다. 

------------------------------------------------------------


& AND (비트별 논리곱)


| OR (비트별 논리합)


^ XOR (비트별 배타 논리합)


~ 1의 보수


<< 왼쪽으로 쉬프트


>> 오른쪽으로 쉬프트


------------------------------------------------------------

다음과 같은 것들이 있는데 하나씩 자세히 알아보죠. 

(1) 비트별 논리곱


&는 비트 단위로 AND연산을 하는 건데,

연산하려는 두 개의 비트가 모두 1일때만 결과가 1이 되고

하나라도 0이면 결과는 0이 됩니다.

정리하면

------------------------------------------------------------

첫번째 비트 두번째 비트 결과

------------------------------------------------------------

1 & 1 1


1 & 0 0


0 & 1 0


0 & 0 0

------------------------------------------------------------


이렇게 되죠


한가지 문제를 드리죠


0x0F & 0xFF = ?


알아맞춰 보세요.

답은 0x0F죠.


0x0F는 이진수로 00001111입니다. 0xFF는 11111111이죠.

그런데 &연산자는 모두 1일때만 1을 돌려 줌니다.


00001111과 11111111에서 모두 1인 부분은 뒤쪽 4개의 비트죠.

그러므로 결과는 00001111

이걸 16진수로 고치면 0x0F가 되죠.


다시 정리하면

------------------------------------------------------------


0x0F = 00001111


0xFF = 11111111


---------- (& 연산)


00001111 = 0x0F


------------------------------------------------------------

이해가 되시죠? 


(2) 비트별 논리합

다음으로 |연산자에 대해 자세히 알아보죠.

|는 OR연산을 하는 것으로 &와는 달리 두개의 비트중 1개라도 1이면

1을 돌려주는 연산자 입니다.


------------------------------------------------------------

첫번째 비트 두번째 비트 결과

------------------------------------------------------------


1 | 1 1


1 | 0 1


0 | 1 1


0 | 0 0

------------------------------------------------------------


이런 연산을 하는 연산자 입니다.


그럼 이것두 문제를 드릴까요?


아까처럼 0x0F와 0xFF를 쓰도록 하죠

그런데 이 두개를 OR연산 하면 어떤 결과가 나올까요?

당연히 0xFF죠.


이유는 하나라도 1이면 1을 돌려 주므로.

------------------------------------------------------------

0x0F = 00001111


0xFF = 11111111


---------- (| 연산)


11111111 = 0xFF

------------------------------------------------------------

이렇게 되기 때문이죠.


(3) 비트별 배타 논리합

다음으로 ^연산자에 대해 알아보죠.

^는 비트단위 배타 OR연산 즉 비트단위 XOR연산을 하는 연산자 입니다.

이 연산자는 OR비슷하지만, 다른점은 두개의 비트가 모두 1일때는 0을 돌려준다는 것이죠.

OR에서는 1을 돌려주지만 즉..

------------------------------------------------------------

첫번째 비트 두번째 비트 결과

------------------------------------------------------------

1 ^ 1 0


1 ^ 0 1


0 ^ 1 1


0 ^ & 0

------------------------------------------------------------


다음과 같은 연산을 하게 됩니다.


그럼 이번엔 0x0F와 0xFF를 XOR연산 하면 어떤 결과가 나올까요?


이건

------------------------------------------------------------

0x0F = 00001111


0xFF = 11111111


---------- (| 연산)


11110000 = 0xF0

------------------------------------------------------------

이렇게 해서 0xF0이 나오게 됩니다. 


(4) 1의 보수


다음으로 ^연산자에 대해 알아보죠.


^는 1의 보수를 구하는 연산자로 그냥 쉽게 비트들을 반대로


즉 0이면 1로 1이면 0으로 바꿔버린다고 알고계시면 됩니다.

------------------------------------------------------------

비트 결과

------------------------------------------------------------


~ 0 1


~ 1 0

------------------------------------------------------------


이런 연산을 하는 것이죠.


1의 보수 연산을 잘 쓰면 좋은점이 많이 있습니다.

만약 여러분이 unsigned long가 가질수 있는 가장 큰 값을 써야 할 경우 어떻게 할까요?

unsigned long는 4294967296까지 넣을수 있는데 이걸 직접 써야 할까요?

그렇게 해도 되고 좀더 쉬운 방법으로 0xFFFFFFFF라고 써도 되겠지만 더 쉬운 방법은 ~0이라고 쓰는 것 입니다.

0은 모든 비트가 0인데 이걸 1의 보수 연산자로 ~0이라고 쓰면 모든 비트가 1이 되므로 가장 큰값이 되는 것이죠. 


(5) 쉬프트

다음으로 쉬프트 연산자인 <<와 >>에 대해 알아보죠

<<,>>는 지정된 방향으로 지정되 수 만큼 비트를 이동시키는 것 입니다.


예를 들어 

?? = 0xF0 >> 4; 

이렇게 하면 0xF0 즉 11110000을 >>방향으로 4만큼 이동시키는 것이죠


그래서 결과는 00001111 즉 0x0F가 됩니다.

만약 1이 오른쪽 끝까지 갔다면 그냥 없어집니다.

그리고 왼쪽은 0으로 계속 채워지구요.


<<도 이것과 똑같으나 방향만 다를 뿐 입니다.


이것으로 비트별 연산자는 마치도록 하죠.