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
'Back-End > 그 외' 카테고리의 다른 글
[Spring] Version 별 특징 (0) | 2023.06.26 |
---|---|
[Spring] JAVA SPRING관련 용어정리 (0) | 2023.02.10 |
[Lombok] Lombok @Getter,@Setter Annotation 인식 안됨 [해결] (0) | 2023.02.10 |
eclipse로 개발할 때 maven으로 다운받은 jar의 소스와 javadoc을 자동으로 붙이기 (0) | 2023.02.10 |
[Android] Retrofit2 @Body @Field 차이 (0) | 2023.02.09 |