본문 바로가기
프로그래밍/c언어 기초공부

[C언어 기초-09] 비트 연산자 논리 연산자 ~, &, |, ^

by 졸린이 2024. 1. 25.
반응형

비트 논리 연산자는 하나의 단항 연산자(~)와 세 개의 이항 연산자(&, |, ^)로 구성되어 있다.
논리 연산자와 기본 메커니즘은 같다고 생각하면 되고 비트는 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의 보수도 정리를 해야겠다.

반응형

댓글