비트 논리 연산자는 하나의 단항 연산자(~)와 세 개의 이항 연산자(&, |, ^)로 구성되어 있다.
논리 연산자와 기본 메커니즘은 같다고 생각하면 되고 비트는 0과 1로 되어있으니 0이 거짓 1이 참으로 생각하면 된다.
연산자 | 의미 | 사용법 | 기능 |
~ | 비트 부정 (NOT) | ~ x | x의 각 비트를 반전 1의 보수 연산 |
& | 비트곱 (AND) | x & y | x, y를 각 비트 단위로 AND 연산 |
| | 비트합 (OR) | x | y | x, y를 각 비트 단위로 OR 연산 |
^ | 배타적 논리합 (XOR) | x ^ y | x, y를 각 비트단위로 XOR |
비트 부정(~)은 0은 1로 1은 0으로 바꾸면 된다. (NOT)
비트곱은 두 값이 1일 경우만 1로 계산한다. (AND)
비트합은 둘 중 하나라도 1이면 1로 계산한다. (OR)
배타적 논리합은 두 명제가 둘 다 참이거나 거짓일 때 0, 두 명제의 값이 다르면 1로 계산한다. (XOR)
x | y | ~ y | x & y | x | y | x ^ y |
1 1 0 0 |
1 0 1 0 |
0 1 0 1 |
1 0 0 0 |
1 1 1 0 |
0 1 1 0 |
x, y에 값을 주고 계산을 하면 이렇게 나온다.
코드로 확인을 해보자.
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>
main() {
char x = 45; // 0 0 1 0 1 1 0 1
char y = 85; // 0 1 0 1 0 1 0 1
printf("~ y %d\n", ~ y);
printf("x & y = %d\n", x & y);
printf("x | y = %d\n", x | y);
printf("x ^ y = %d\n", x ^ y);
}
|
cs |
값이 어떻게 나왔는지 확인해 보자.
x = 45, y = 85 값을 할당하고 비트로 표현을 해보면
x : 0 0 1 0 1 1 0 1
y : 0 1 0 1 0 1 0 1
10진수를 2진수로 변환하는 것은 의무교육을 나왔으면 알 거라고 생각한다.
7행의 먼저 비트 부정은 y로 계산했기 때문에 비트를 다 뒤집으면 10101010 이 되는데 맨 앞에 1이 있으면 부호가 -가 되어 음수가 된다. 저걸 이제 10진수를 표현해 보면 -86이 되는데 그렇게 되는 이유는 2의 보수를 알아야 한다.
여기서는 간단하게 설명하자면 어떤 수의 부호를 반전시키려면 비트를 반전시킨 뒤에 1을 더하면 된다.
10101010 이 몇인지 확인하기 위해서는 우선 다시 반전시키면 01010101이 된다. 그 값은 코드에 나와있듯이 85가 되는데 여기서 1을 더하면 86이 된다.
즉 10101010은 -86이 되는 것이다.
8행의 & 연산을 하면 둘 다 1일 때 1이므로 00000101 이 되는데 한눈에 봐도 5가 된다.
9행의 | 연산은 하나라도 1이면 1이 되므로 01111101 이 되는데 1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6 (1 + 4 + 8 + 16 + 32 + 64) 이렇게 125가 나온다.
10행 ^ 연산은 x y의 비트 위치가 서로 같으면 0 다르면 1이므로 01111000 이 되므로 2^3 + 2^4 + 2^5 + 2^6 (8 + 16 + 32 + 64) 120이 나온다.
나중에 비트 음수 표현, 1의 보수 2의 보수도 정리를 해야겠다.
'프로그래밍 > c언어 기초공부' 카테고리의 다른 글
[C언어 기초-11] 조건 연산자(conditional operator) 삼항 연산자 (0) | 2024.08.01 |
---|---|
[C언어 기초-10] 복합 대입 연산자 (산술 대입 연산자, 비트 대입 연산자) (0) | 2024.08.01 |
[C언어 기초-08] 비트 연산자 시프트 연산자 (0) | 2024.01.08 |
[C언어 기초-07] 논리 연산자 and, or, not연산자 &&, ||, ! (0) | 2021.08.21 |
[C언어 기초-06] 관계(비교) 연산자 (0) | 2021.08.18 |
댓글