비트연산자
정수형 타입에만
논리 게이트 | |||
& | AND | 두 비트 모두 1 이면 1, 나머지 0 | ![]() |
| | OR | 두 비트 모두 0 이면 0, 나머지 1 | ![]() |
^ | XOR | 두 비트가 서로 다르면 1, 서로 같으면 0 | ![]() |
~ | NOT | 1의 보수 | ![]() |
<< | 왼쪽 Shift | 왼쪽으로 비트 이동 (값 커짐 - 곱셈) | ![]() |
>> | 오른쪽 Shift | 오른쪽으로 비트 이동 (값 작아짐 - 나눗셈) |
시프트 연산자
*2 의 경우 << 1 *4 의 경우 << 2
/2 의 경우 >> 1 /4 의 경우 >> 2
따라서 다음과 같은 식이 성립
x * 2n == x << n
x / 2n == x >> n
#include <bitset>
int i = 1;
i = i << 30;
cout << i << " " << bitset<32>(i) << endl; // 1073741824 01000000000000000000000000000000
i = i << 1;
cout << i << " " << bitset<32>(i) << endl; // -2147483648 10000000000000000000000000000000 (부호비트 1 / 나머지 0 -> int 최소값)
i = i << 1;
cout << i << " " << bitset<32>(i) << endl; // 0 00000000000000000000000000000000 (32비트인데 더 밀어버려서 overflow 발생 / 새로운 비트 0 으로 채워짐)
i = i >> 2;
cout << i << " " << bitset<32>(i) << endl; // 0 00000000000000000000000000000000 0을 아무리 밀어도 0
#include <bitset>
int i = pow(2,4);
cout << i << " " << bitset<32>(i) << endl; // 16 00000000000000000000000000010000
i = i >> 5;
cout << i << " " << bitset<32>(i) << endl; // 0 00000000000000000000000000000000
i = i << 3;
cout << i << " " << bitset<32>(i) << endl; // 0 00000000000000000000000000000000 0을 아무리 밀어도 0
왼쪽 Shift는 연산 시 0으로 채워짐
오른쪽 Shift 관련
int i = -100;
cout << i << " " << bitset<32>(i) << endl; // -100 11111111111111111111111110011100
i = i >> 2;
cout << i << " " << bitset<32>(i) << endl; // -25 11111111111111111111111111100111
부호 비트가 1이면 오른쪽 시프트 연산 시 1로 채워짐
unsigned 와 양수일 경우 0이 채워짐
산술 연산자
덧셈 / 뺄셈 / 곱셈 / 나눗셈은 위의 논리 게이트들의 조합으로 이루어진 논리 회로에 의해 계산된다.
대충 4비트 감가산기 | 대충 4비트 곱셈기 | 대충 4비트 나눗셈기 |
![]() 가산기 - AND / XOR / OR 로 구성 감산기 - 가산기 + NOT + Carry |
![]() 가산기 + Shift + AND |
![]() 감산기 + Shift + 비교 + 조건분기 |
비트 연산자가 훨씬 빠른 이유
'이론' 카테고리의 다른 글
앱 식별자 용어 (0) | 2025.02.10 |
---|---|
캐시 메모리 (Cache Memory) (0) | 2023.03.04 |
의존성 제어 (0) | 2022.12.20 |
Solid (0) | 2022.11.06 |
상속 / 조합 (Composition) (0) | 2022.10.26 |