Back-End/그 외

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

HMHA 2023. 2. 16. 09:15
300x250
반응형
300x250

C 언어는 비트끼리 연산을 할 수 있는 연산자가 있습니다. 그 종류는 다음과 같습니다.

 

연산자 연산자의 기능
& 비트단위로 AND 연산을 한다.
| 비트단위로 OR 연산을 한다.
^ 비트단위로 XOR 연산을 한다.
~ 단항 연산자로서 피연자의 모든 비트를 반전시킨다.
<< 피연산자의 비트 열을 왼쪽으로 이동시킨다.
>> 피연산자의 비트 열을 오른쪽으로 이동시킨다.

 

 

 

1. & 연산자

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

 

연산 결과
0 & 0 0
0 & 1 0
1 & 0 0
1 & 1 1

 

 

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

 

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

00000000 00000000 00000000 00000100

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

   00000000 00000000 00000000 00001111

& 00000000 00000000 00000000 00010100

= 00000000 00000000 00000000 00000100

2. | 연산자

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

 

연산 결과
0 | 0 0
0 | 1 1
1 | 0 1
1 | 1 1

 

 

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

 

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

   00000000 00000000 00000000 00001111

 | 00000000 00000000 00000000 00010100

= 00000000 00000000 00000000 00011111

3. ^연산자

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

 

연산 결과
0 ^ 0 0
0 ^ 1 1
1 ^ 0 1
1 ^ 1 0

 

 

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

 

 

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

   00000000 00000000 00000000 00001111

^ 00000000 00000000 00000000 00010100

= 00000000 00000000 00000000 00011011

 

 

 

4. ~ 연산자

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

 

연산 결과
~ 0 1
~ 1 0

 

 

코드 출처 : 윤성우, 「열혈 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 ​

 

 

 

 

참고자료 : 윤성우, 「열혈 C프로그래밍」, ORANGE MEDIA, 2013

 


출처 : https://gksid102.tistory.com/90

 

4. C 비트연산자(연산자 &, |, ^, ~, <<, >>, and, or, xor, 비트 반전, 비트 이동)

C 언어는 비트끼리 연산을 할 수 있는 연산자가 있습니다. 그 종류는 다음과 같습니다. 연산자 연산자의 기능 & 비트단위로 AND 연산을 한다. | 비트단위로 OR 연산을 한다. ^ 비트단위로 XOR 연산을

gksid102.tistory.com

 

300x250
반응형