본문 바로가기

BackEnd/C

비트 쉬프트(Shift) 연산자

반응형

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


반응형

'BackEnd > C' 카테고리의 다른 글

1차원 배열의 이해와 활용  (0) 2019.03.09
비트 마스크  (0) 2019.03.09
비트연산자  (0) 2019.03.08
.  (0) 2019.03.08
.  (0) 2019.03.08