비트 시프트 연산자란 3가지 표현이 있다
<< : 왼쪽으로 이동 👈
>> : 오른쪽으로 이동 👉
>>> : unsigned, 오른쪽으로 이동 👉👉
int a = 0x00000010; // 10진수 '16' 을 16진수로 표현
a = a << 2;
a
0000 0000 0000 0000 0000 0000 0001 0000 // 16
a << 2
0000 0000 0000 0000 0000 0000 0100 0000 // 64
1이 왼쪽으로 2칸 이동하고 뒤에 0이 2개 붙었다. 16이 64가 됨.
- 비트 값들을 왼쪽으로 이동시킨 후에 오른쪽의 빈 공간에는 모두 0 으로 채운다.
- "A << B"의 연산시 결과 값은 "A*(2의 B제곱)"한 결과와 같다.
int a = 2147483647; // 2^31-1
a = a>>1;
a>>=30;
a
1000 0000 0000 0000 0000 0000 0000 0000 // -2147483648 = -2^31
a = a >> 1
1100 0000 0000 0000 0000 0000 0000 0000 // -1073741824 = -2^30
a>>30
1111 1111 1111 1111 1111 1111 1111 1111 // -1 = -2^0
int x = -8; // 11111111 11111111 11111111 11111000
int y = x>>2; // 오른쪽으로 2비트만큼 이동시킴.
int z = x>>3; // 오른쪽으로 3비트만큼 이동시킴.
printf("%d\n", y); // 11111111 11111111 11111111 11111110 : -2
printf("%d", z); // 11111111 11111111 11111111 11111111 : -1
비트 값들을 오른쪽으로 이동시킨 후에 왼쪽의 빈 공간에는 양수는 모두 0 으로, 음수는 모두 1 로 채운다.
a = -2147483648 // -2^31
a >>>= 1;
a >>>= 30;
a
1000 0000 0000 0000 0000 0000 0000 0000 // -2147483648 = -2^31
a >>>= 1
0100 0000 0000 0000 0000 0000 0000 0000 // 1073741824 = 2^30
a >>>= 30
0000 0000 0000 0000 0000 0000 0000 0001 // 1 = 2^0
'>>>' 연산자는 부호를 신경쓰지 않는다.
비트 값들을 오른쪽으로 이동시킨 후에 왼쪽의 빈 공간은 모두 0 으로 채운다.
앞으로 2의 제곱 계산시 시프트 연산을 사용해서 코드 짜는걸로~