언어 자료구조 알고리즘/C언어 예제

쉬프트 연산

언제나휴일 2009. 8. 19. 05:47
반응형

쉬프트 연산

 

좌항이 int형일 경우에 << 는 논리 쉬프트이며  >>는 산술 쉬프트입니다. 
좌항이 unsigned일 경우에는 << 과 >> 모두 논리 쉬프트입니다. 

  

아래 디스어셈블리 창을 참고하세요. (s는 쉬프트,h은 논리, a는 산술 , l은 좌측, r은 우측)

shl : 좌측논리쉬프트, sar:우측산술쉬프트, shr:우측논리쉬프트 

즉, 차이는 우측 쉬프트연산에서 차이가 발생하게 됩니다. 

 

논리 쉬프트는 빈 자리를 0으로 채웁니다.

산술 쉬프트는 빈 자리를 부호비트로 채웁니다. 

 

예제를 통해 풀어봅시다.

int fun1(unsigned word)
{
 return (int) ((word <<24) >>24);
}

int fun2(unsigned word)
{
 return ((int) word <<24 >>24);
}

 

127은 이진수로 표기하면 0000 0000 0000 0000 0000 0000 0111 1111와 같습니다.

이를 24비트 좌측 쉬프트를 하면

fun1이나 fun2나 모두 0111 1111 0000 0000 0000 0000 0000 0000 이 되며

다시 24비트 우측 쉬프트를 하면

fun1의 경우 논리 쉬프트이기 때문에 빈자리는 0으로 채워져

    다시 0000 0000 0000 0000 0000 0000 0111 1111 이 됩니다. 즉, 127

fun2의 경우 산술 쉬프트인데 부호비트가 0이기 때문에 빈자리는 0으로 채워져

    fun1과 마찬가지로 다시 0000 0000 0000 0000 0000 0000 0111 1111 이 됩니다. 즉, 127

 

255의 경우는 이진수로 표기하면 0000 0000 0000 0000 0000 0000 1111 1111와 같습니다.

이를 24비트 좌측 쉬프트를 하면

fun1이나 fun2나 모두 1111 1111 0000 0000 0000 0000 0000 0000 이 되며

다시 24비트 우측 쉬프트를 하면

fun1의 경우 논리 쉬프트이기 때문에 빈자리는 0으로 채워져

    다시 0000 0000 0000 0000 0000 0000 1111 1111 이 됩니다. 즉, 255

fun2의 경우 산술 쉬프트인데 부호비트가 1이기 때문에 빈자리는 1로 채워져

    fun1과 다르게 1111 1111 1111 1111 1111 1111 1111 1111 이 됩니다. 즉, -1

 

 

 

보너스 

부호있는 수를 표현하는 방법 중에 2의 보수를 이용하는 방법에 대한 설명입니다. 

일단 맨 상위 비트가 0이면 양수 1이면 음수입니다. 

양수의 경우 나머지 비트는 크기를 나타냅니다. 

음수의 경우는 2의보수를 취한 것에 해당하는 수에 -부호만 붙습니다. 

2의 보수는 1의 보수를 취한 수에 1을 더하면 2의 보수가 됩니다. 

즉, 1100의 1진 보수는 0011 이므로

      1100의 2진 보수는 0100 이 됩니다. 

예를 들어 4비트를 가지고 부호있는 수를 2진 보수로표현한다면 다음과 같습니다.

 0000  0  1000  -8
 0001  1  1001  -7
 0010  2  1010  -6
 0011  3  1011  -5
 0100  4  1100  -4
 0101  5  1101  -3
 0110  6  1110  -2
 0111  7  1111  -1

1000은 짝이 되는 양의 수가 없습니다.

규칙성에 따라 -8로 정의를 하고 있습니다. 

즉, 정수에서 8바이트 모두 1로 채워진 수인

   1111 1111 1111 1111 1111 1111 1111 1111

는 -1로 취급되는 것입니다.

 

 

반응형