비트연산자

정수형 타입에만

      논리 게이트
& 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비트 나눗셈기
대충 4비트 가/감산기

가산기 - AND / XOR / OR 로 구성
감산기 - 가산기 + NOT + Carry
대충 4비트 곱셈기

가산기 + Shift + AND
대충 4비트 나눗셈기

감산기 + 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

+ Recent posts