본문으로 바로가기

비트 이동 연산자의 부호 유지 정책

오른쪽 쉬프트 연산을 하더라도 부호 비트는 항상 유지하는 정책이다. 부호가 음수일 경우 비트단위에서 비 직관적인 동작으로 보일 수 있기 때문에 인지하고 있을 필요가 있다.

 

예를 들어, 8비트 [0100 0000]을 오른쪽으로 한번 쉬프트 연산을 할 경우 [0010 0000] 이 되지만, [1000 0000]의 경우 오른쪽으로 쉬프트 연산을 할 경우 [0100 0000]이 아니라 [1100 0000]이 된다. 이런 정책을 사용하는 이유는 오른쪽 쉬프트 연산은 '나누기 2'의 결과 동일하도록 하기 위함이다. 정수로 표현하면 [1000 0000] (-128)에 오른쪽 쉬프트를 적용할 경우 [1100 0000] (-64)가 된다.

 

예제는 다음과 같다.

#include <iostream>
#include <bitset>

int main()
{
    char a = 1;

    std::cout << std::bitset<8>(a) << " " << (int)a << std::endl;
    a = a << 7;

    std::cout << std::bitset<8>(a) << " " << (int)a << std::endl;

    for (int i = 0; i < 7; ++i)
    {
        a = a >> 1;
        std::cout << std::bitset<8>(a) << " " << (int)a << std::endl;
    }
    return 0;
}

출력 결과

00000001 1
10000000 -128
11000000 -64
11100000 -32
11110000 -16
11111000 -8
11111100 -4
11111110 -2
11111111 -1

 


출처: C++ Fundamental (저자: 김화수)