1. & 연산자
& 연산은 두 개의 비트가 모두 1일 때 1을 반환하는 AND 연산을 한다. 따라서 & 연산자의 비트단위 연산의 결과는 다음과 같다.
위 연산의 결과 4의 비트는 다음과 같다.
00000000 00000000 00000000 00000100
즉 다음과 같은 연산과정을 거친다.
00000000 00000000 00000000 00001111
& 00000000 00000000 00000000 00010100
= 00000000 00000000 00000000 00000100
2. | 연산자
| 연산은 두 개의 비트 중 하나라도 1이면 1을 반환하는 OR 연산이다. 따라서 | 연산자의 비트단위 연산의 결과는 다음과 같다.
위 연산의 결과 31은 다음과 같은 연산과정을 거친다.
00000000 00000000 00000000 00001111
| 00000000 00000000 00000000 00010100
= 00000000 00000000 00000000 00011111
3. ^연산자
^| 연산은 두 개의 비트가 서로 다른 경우에 1을 반환하는 XOR 연산이다. 따라서 다음의 연산결과를 보인다.
위 연산의 결과 27은 다음과 같은 연산과정을 거친다.
00000000 00000000 00000000 00001111
^ 00000000 00000000 00000000 00010100
= 00000000 00000000 00000000 00011011
4. ~ 연산자
~ 연산은 비트를 0에서 1로, 1에서 0으로 반전시키는 NOT 연산이다. 보수연산이라고도 불리며, 연산의 결과는 다음과 같다.
~ 00000000 00000000 00000000 00001111
= 11111111 11111111 11111111 11110000
위 연산의 결과 -16에서 알 수 있듯이 ~ 연산은 MSB도 반전되어 부호를 바꾸는 것에 주의해야한다.
5. << 연산자
<< 연산자는 비트를 왼쪽으로 이동하는 shift 연산이다.
num1 << num2
로 표현되며 num1의 비트 열을 num2칸씩 왼쪽으로 이동시킨다는 의미를 갖고 있다.
위 결과로 나온 30, 60, 120은 15와 비교해 보았을 때 다음과 같은 비트열을 갖고 있다.
15 : 00000000 00000000 00000000 00001111
30 : 00000000 00000000 00000000 00011110
60 : 00000000 00000000 00000000 00111100
120 : 00000000 00000000 00000000 01111000
비트의 이동으로 인해서 생기는 오른쪽 빈 칸은 0으로 채워지고, 이동으로 인해서 밀려나는 왼쪽 비트들은(4바이트를 넘어서는 비트들)그냥 버려진다. 또한 비트의 열을 왼쪽으로 1칸씩 이동시킬 때마다 정수의 값은 두 배가 된다는 사실도 알 수 있다. 따라서 가끔 곱셈과 나눗셈 연산은 비트의 이동 연산으로 대체할 수 있으며, 이는 곧 성능의 현상으로 이어진다.
6. >> 연산자
>> 연산자는 비트를 오른쪽으로 이동하는 shift 연산이다.
num1 >> num2로 표현되며 num1의 비트 열을 num2칸씩 오른쪽으로 이동시킨다는 의미를 갖고 있다.
num1이 양수라면, << 연산자와 같이 이동으로 인해서 밀려나는 오른쪽 비트들은 소멸되고 이동으로 인해서 생긴 왼쪽의 빈 자리는 0으로 채워진다. 그러나 num1이 음수라면 그 결과는 CPU에 따라서 달라진다. 음의 값을 유지하기 위해서 1을 채우는 CPU도 있고, 음의 값 유지에 상관하지 않고 0을 채우는 CPU도 있다.
11111111 11111111 11111111 11110000
>> 2
= 00111111 11111111 11111111 11111100
or 11111111 11111111 11111111 11111100
각자가 사용하는 CPU는 어떻게 연산을 하는지 다음 예제를 통해 확인해볼 수 있다.
4. C 비트연산자(연산자 &, |, ^, ~, <<, >>, and, or, xor, 비트 반전, 비트 이동) :: 맥스웰과 데자와 (tistory.com)
'프로그래밍 언어 > C++' 카테고리의 다른 글
[골5] 27172 - 수 나누기 게임 (0) | 2023.09.26 |
---|---|
[C++] cout 소수점 n자리까지 표시하기 (0) | 2023.09.26 |
[C++] 함수를 객체로 사용하기 (std::function, std::mem_fn, std::bind) (0) | 2023.09.23 |
[C] 함수 포인터 사용법 & 예제 총 정리 (0) | 2023.09.23 |
[C++] 매크로 개념과 주의사항 (0) | 2023.09.20 |