비트 연산자(bitwise operator)
비트 연산자는 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자입니다.
비트란?
비트를 설명하려면 이진수를 먼저 알아야하는데요. 이진수는 0과 1로 이루어져 있는 것을 말하며 이 이진수에서 한 자리를 나타내는 것을 비트(bit)라고 합니다.
비트 연산자 | 설명 |
& | 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산) |
| | 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산) |
^ | 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산) |
~ | 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산) |
<< | 지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산) |
>> | 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산) |
설명을 이렇게 들으면 잘 모르시겠죠.
가장 먼저 알아야할 것은 10진수를 2진수로 만드는 법부터 아셔야합니다.
10진수를 2진수로 만드는 방법
- 2로 나누기: 10진수를 2로 나눕니다.
- 몫과 나머지 구하기: 나눈 결과에서 몫과 나머지를 구합니다.
- 나머지를 기록하기: 나머지를 오른쪽부터 왼쪽으로 차례대로 기록합니다.
- 몫이 0이 될 때까지 반복: 몫이 0이 될 때까지 위의 과정을 반복합니다.
- 결과값 뒤집기: 기록된 나머지를 역순으로 배열하여 2진수를 완성합니다.
13이라는 숫자로 예를 들어보겠습니다.
- 13 ÷ 2 = 6 ... 1 - 나머지가 1
- 6 ÷ 2 = 3 ... 0 - 나머지 없음
- 3 ÷ 2 = 1 ... 1 - 나머지 1
- 1 ÷ 2 = 0 ... 1 - 나머지 1
이렇게 나온 1011이라는 결과를 역순으로 배열하면 끝입니다. 13의 이진수는 : 1101
10진수를 2진수로 만드는데에 성공했으니 이제 비트 연산자에 연관지어 보겠습니다.
📝 & : 비트 AND 연산
대응되는 두 비트가 모두 1이면 1을 반환하며, 다른 경우는 모두 0을 반환합니다.
먼저 해야할 것은 10진수를 2진수로 바꾸는 것입니다. 15와 21로 예를 들겠습니다.
10진수 : 2진수
15 : 00001111
21 : 00010101
이진법의 한 숫자씩 비교해서 두 수가(= 두 비트) 모두 1일 때만 1을 반환하고 다른 경우는 모두 0을 반환하는 겁니다.
15 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
21 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
출력 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
첫번 째부터 다섯 번째자리 까지 둘 다 1인 것이 없으니 0이고 둘 다 1인 자리는 1을 반환합니다.
그러므로 결과값은 00000101 입니다.
📝 | : 비트 OR 연산
역시 마찬가지로 진행해 주시면 됩니다.
이 비트는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환합니다.
15 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
21 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
출력 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
📝 ^ : 비트 XOR 연산
비트 XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환합니다.
15 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
21 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
출력 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
📝 ~ : 비트 NOT 연산
비트 NOT 연산자는 해당 비트가 1이면 0을 반환하고, 0이면 1을 반환합니다.
15 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
출력 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
📝 <<, >> : 시프트 연산자
시프트 연산자는 2진수, 비트를 이동시키는 연산자로 생각해 주시면 좋습니다.
여기 10진수를 2진수로 변환한 것입니다. 여기서 시프트 연산을 쓴다면 10 << 2 이렇게 사용 할 수 있습니다.
0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
10 <<2 에 대한 의미는 쉽게 생각하면 2칸을 이동하라는 뜻입니다. 즉,
' 10을 2진수로 변환한 비트 값을 왼쪽으로 2칸씩 이동하세요 ' 라는 뜻이 됩니다.
0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 |