반응형
1. 비트 쉬프트 연산자란?
비트 연산자의 부류에 속하는 비트 쉬프트 연산자가 있다.
이 연산자들은 정수 데이터의 비트 열을 왼쪽, 오른쪽으로 이동시키는 연산자이다.
2. << 연산자 : 비트를 왼쪽으로 이동
<< 연산자도 두 개의 피연산자를 필요로 하는 이항 연산자이며, 모두 정수이어야 한다.
int C = A << B;
이는 A의 비트 열을 B의 크기만큼 왼쪽으로 이동시켜서 얻은 결과를 변수 C에 저장하라는 뜻이다.
<< 연산에 의해서 비워지는 오른쪽 비트는 0으로 채워진다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int main(void) { int n=7; /* 00000000 00000000 00000000 00000001 */ int r1=n<<1; /* 00000000 00000000 00000000 00000010 */ int r2=n<<2; /* 00000000 00000000 00000000 00000100 */ int r3=n<<3; /* 00000000 00000000 00000000 00001000 */ int r4=n<<4; /* 00000000 00000000 00000000 00010000 */ printf("result1=%d \n", r1); printf("result2=%d \n", r2); printf("result3=%d \n", r3); printf("result4=%d \n", r4); return 0; } | cs |
1 2 3 4 | result1=14 result2=28 result3=56 result4=112 | cs |
출력값을 보면 비트의 열을 한 칸씩 왼쪽으로 이동할때마다 2배로 증가한다는 것을 알 수 있다.
즉 비트 단위 연산자가 곱셉과 나눗셈이라는 상대적으로 느린 연산을 대신할 수 있다는 것이다.
3. >> 연산자 : 비트를 오른쪽으로 이동
>>연산에 의해서 비트의 열을 이동하는 과정에서 잘려 나가는 오른쪽 비트는 버려지고,
비게 되는 왼쪽 자리를 채우는 방법은 CPU마다 다르다.
MSB 유지하는 CPU 가 있고, 0을 채우는 CPU가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int main(void) { int n=-16; /* 11111111 11111111 11111111 11110000 */ int r1=n>>1; /* ???? */ int r2=n>>2; /* ???? */ int r3=n>>3; /* ???? */ int r4=n>>4; /* ???? */ printf("result1= %d \n", r1); printf("result2= %d \n", r2); printf("result3= %d \n", r3); printf("result4= %d \n", r4); return 0; } | cs |
내가 사용하는 환경에서의 결과값이다.
1 2 3 4 | result1= -8 result2= -4 result3= -2 result4= -1 | cs |
반응형