프로그래밍 언어/C++

[C/C++] 비트연산자 (&, |, ^, ~, <<, >>, and, or, xor, 비트 반전, 비트 이동)

ShovelingLife 2023. 9. 25. 13:15

1. & 연산자

& 연산은 두 개의 비트가 모두 1일 때 1을 반환하는 AND 연산을 한다. 따라서 & 연산자의 비트단위 연산의 결과는 다음과 같다.

 

코드 출처 : 윤성우, 「열혈 C프로그래밍」, 93p

 

위 연산의 결과 4의 비트는 다음과 같다.

00000000 00000000 00000000 00000100

즉 다음과 같은 연산과정을 거친다.

   00000000 00000000 00000000 00001111

& 00000000 00000000 00000000 00010100

= 00000000 00000000 00000000 00000100

2. | 연산자

| 연산은 두 개의 비트 중 하나라도 1이면 1을 반환하는 OR 연산이다. 따라서 | 연산자의 비트단위 연산의 결과는 다음과 같다.

 

코드 출처 : 윤성우, 「열혈 C프로그래밍」, 95p

 

위 연산의 결과 31은 다음과 같은 연산과정을 거친다.

   00000000 00000000 00000000 00001111

 | 00000000 00000000 00000000 00010100

= 00000000 00000000 00000000 00011111

3. ^연산자

^| 연산은 두 개의 비트가 서로 다른 경우에 1을 반환하는 XOR 연산이다. 따라서 다음의 연산결과를 보인다.

 

코드 출처 : 윤성우, 「열혈 C프로그래밍」, 96p

 

위 연산의 결과 27은 다음과 같은 연산과정을 거친다.

   00000000 00000000 00000000 00001111

^ 00000000 00000000 00000000 00010100

= 00000000 00000000 00000000 00011011

4. ~ 연산자

~ 연산은 비트를 0에서 1로, 1에서 0으로 반전시키는 NOT 연산이다. 보수연산이라고도 불리며, 연산의 결과는 다음과 같다.

 

코드 출처 : 윤성우, 「열혈 C프로그래밍」, 97p

 

~ 00000000 00000000 00000000 00001111

= 11111111 11111111 11111111 11110000

위 연산의 결과 -16에서 알 수 있듯이 ~ 연산은 MSB도 반전되어 부호를 바꾸는 것에 주의해야한다.

5. << 연산자

<< 연산자는 비트를 왼쪽으로 이동하는 shift 연산이다.

num1 << num2

로 표현되며 num1의 비트 열을 num2칸씩 왼쪽으로 이동시킨다는 의미를 갖고 있다.

코드 출처 : 윤성우, 「열혈 C프로그래밍」, 98p

 

위 결과로 나온 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는 어떻게 연산을 하는지 다음 예제를 통해 확인해볼 수 있다.

코드 출처 : 윤성우, 「열혈 C프로그래밍」, 100p ​

 

 

4. C 비트연산자(연산자 &, |, ^, ~, <<, >>, and, or, xor, 비트 반전, 비트 이동) :: 맥스웰과 데자와 (tistory.com)