C++에서 비트 시프트 연산자(bitwise shift operator)는 비트를 좌우로 이동시키는 연산자입니다. 크게 두 가지가 있는데, 비트를 오른쪽으로 밀어내는 오른쪽 시프트 연산자(>>)와 비트를 왼쪽으로 밀어내는 왼쪽 시프트 연산자(<<)가 있습니다.
왼쪽 시프트 연산자 (<<)
왼쪽 시프트 연산자는 shift-expression의 비트를 additive-expression에 지정된 횟수만큼 왼쪽으로 이동시킵니다. 이동 후 비어 있게 된 비트 자리는 모두 0으로 채워집니다. 왼쪽 시프트는 논리적 시프트(logical shift) 방식으로 동작하며, 끝을 넘어 밀려나간 비트는 부호 비트를 포함하여 모두 버려집니다.
오른쪽 시프트 연산자 (>>)
오른쪽 시프트 연산자는 shift-expression의 비트 패턴을 additive-expression에 지정된 횟수만큼 오른쪽으로 이동시킵니다. 부호 없는(unsigned) 숫자의 경우 비어 있는 비트 자리는 0으로 채워집니다. 반면 부호 있는(signed) 숫자의 경우에는 부호 비트로 빈 자리를 채우는데, 즉 양수라면 0을, 음수라면 1로 채우게 됩니다.
예제 코드
#include<iostream>
using namespace std;
int main() {
int a = 1, b = 3;
// 현재 a는 00000001
// 왼쪽으로 3비트 시프트하면 00001000, 즉 8이 됨
a = a << 3;
cout << a << endl;
// a를 오른쪽으로 2비트 시프트하면 00000010, 즉 2가 됨
a = a >> 2;
cout << a << endl;
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
8 2
음수 처리 시 주의사항
시프트 연산자는 음수와 함께 사용할 때 동작이 크게 달라진다는 점에 유의해야 합니다. 부호 있는 음수를 오른쪽 시프트한 결과는 컴파일러 구현에 따라 달라질 수 있으며(implementation-defined), 부호 있는 수를 왼쪽 시프트하여 부호 비트에 영향을 주는 경우 그 결과는 정의되지 않은 동작(undefined behavior)이 됩니다.
복합 대입 연산자
이 외에도 시프트 연산의 결과를 왼쪽 피연산자에 바로 대입할 수 있는 두 가지 복합 대입 연산자가 제공됩니다. 바로 <<= 연산자와 >>= 연산자입니다.
시프트 연산자에 대한 보다 자세한 내용은 MSDN 공식 문서를 참고하시기 바랍니다.