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으로 계속 채워지구요.
<<도 이것과 똑같으나 방향만 다를 뿐 입니다.
이것으로 비트별 연산자는 마치도록 하죠.
'공부하자 > C언어' 카테고리의 다른 글
C언어 문법 공부 7장 [if문] (0) | 2016.11.20 |
---|---|
C언어 문법 공부 6장 [기타 연산자] (0) | 2016.11.20 |
C언어 문법 공부 6장 [논리 연산자] (0) | 2016.11.20 |
C언어 문법 공부 6장 [관계형 연산자] (0) | 2016.11.20 |
C언어 문법 공부 5장 [연산자] (0) | 2016.11.19 |