-
728x90
비트 연산은 메모리를 절약할 수 있다는 장점이 있습니다.
비트 연산을 할 때 주의해야할 점은 부호 입니다.
unsigned char a = 131; //1000 0011 char b = -125; //1000 0011 unsigned char aa; char bb; aa = a >> 5; bb = b >> 5; cout << (int)aa; // 4 (0000 0100) cout << (int)bb; //-4 (1111 1100)
char 형은 1bye , 즉 8bit 입니다.
unsigned char 형은 부호가 없는 변수 입니다.
일반적인 변수(char, int , long long 등등) 들은 다 signed형입니다. 따라서 MST의 0과1에 따라 부호가 바뀝니다.
unsigned char 131(1000 0011) >> 5 = 4(0000 0100) 입니다.
char -125 (1000 0011) >> 5 = -4 (1111 1100) signed 숫자에서 bit를 옮길때 비는 공간은 그 수의 부호로 채웁니다.
따라서 남은 bit들은 다 1로 채웠습니다.
컴퓨터는 음수를 표현할 때 2's complement 방식을 사용하므로
1111 1100 -> 0000 0011 -> 0000 0100(4) 가 나오고 부호를 붙여주면 -4가 됩니다.
<< 연산
보시는것과 같이 비트를 왼쪽으로 옮겨주는 연산입니다.
예를 들어 3은 컴퓨터 내부에서 2진수로 0011라고 인식합니다.
여기서 3<<1 이란 의미는 0011 에서 모든 bit를 왼쪽으로 1칸 이동하라는 의미입니다.
따라서 0110 즉, 6이 됩니다.
int a = 3; cout << (a << 3);
다음과 같은 코드에서 출력을 해보면 24가 나옵니다.
<<는 2의 거듭제곱의 곱으로 이해할 수 있습니다.
3 << 3 = 3 * 2^3 과 같은 의미입니다.
>> 연산
<<연산과 완전히 반대입니다. 말그대로 모든 bit를 오른쪽으로 옮겨 줍니다.
6(0110) >>1 = 3(0011) 입니다.
int a = 24; cout << (a >> 3);
>>는 2의 거듭제곱의 나눗셈으로 이해할 수 있습니다.
24 << 3 = 24 / 2^3 과 같은 의미입니다.
& 연산 (AND)
AND연산을 하는 연산자 입니다.
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
int a = 8; //1000 int b = 4; //0100 cout << (a & b); //0000
최종적으로 0을 출력하게 됩니다.
| 연산 (OR)
OR 연산을 하는 연산자 입니다.
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
int a = 5; //0101 int b = 4; //0100 cout << (a | b); //0101
최종적으로 5를 출력하게 됩니다.
^ 연산 (XOR)
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
int a = 1; //0001 int b = 3; //0011 cout << (a ^ b); //0010
최종적으로 2를 출력하게 됩니다.
~ 연산 (NOT)
말 그대로 모든 BIT를 반대로 하는 연산입니다.
unsigned char num1 = 162; // 162: 1010 0010 unsigned char num2; num2 = ~num1; cout << num2; //93 : 0101 1101
'헷갈렸던것' 카테고리의 다른 글
삼항조건연산자 (0) 2021.09.27 버퍼(buffer) c/c++ (0) 2021.09.07 실수형 (부동 소수점) (0) 2021.09.03