비트 이동(shift) 연산자는 방향에 따라 두 가지가 있는데 <<연산자는 왼쪽 이동 연산자이고 >>는 오른쪽 이동 연산자이다. 쉬프트(shift)는 비트의 자리를 이동시킨다는 용어인데 이 연산자의 오른쪽에 적인 숫자의 자리수만큼 순차적으로 이동시킨다. 사용 문법은 var<<n (혹은 var>>n) 이며 변수 var을 n비트 좌측(혹은 우측)으로 이동시킨다.
unsigned char uca = 0b01101100; unsigned char ucb = uca >> 2; // 각 비트를 오른쪽으로 두 자리씩 이동 unsigned char ucc = ucc << 3; // 각 비트를 왼쪽으로 세 자리씩 이동 |
비트들이 자리 이동을 하게 되면 밀려나서 버려지는 비트들이 있으며 반대로 채워야되는 자리가 생기게 되는데 두 가지 경우가 약간 차이가 있다. 먼저, 왼쪽으로 비트들을 이동시키는 << 연산자의 경우 비트들이 왼쪽으로 자리를 이동하게 되면 비는 공간을 0으로 채우게 되며 자리 이동으로 인해 밀려나가는 비트들은 모두 버려지게 된다.
반면, 오른쪽으로 비트들을 이동시키는 >>연산의 경우는 오른쪽으로 밀려나가는 비트들은 버려지지만 좌측에 생기는 빈 공간에는 부호가 없는 데이터형이면 0으로, 반대로 부호가 있는 데이터형은 부호를 유지시키기 위해서 원래 변수 값의 최상위비트(MSB)로 채운다. (주의할 것)
예를 들어 (unsigned char) ucx=5 라면 ucx<<= 2 명령에 의해 원래 (0b00000101)이 (0b00010100) 십진수로 20이 된다. 왼쪽으로 쉬프트는 2를 곱하는 효과가 있으므로 2번 쉬프트하면 4를 곱한 효과가 난다.
unsigned char ucx = 0b00000101; ucx <<= 2; // 0b00010100 이 된다. |
반대로 ucx>>=2 는 결과값이 (0b00000001)이 된며 오른쪽으로 쉬프트하는 것은 2로 나눈 효과가 있게 된다. 이 경우 ucx변수가 부호가 없는 데이터형이기 때문에 최상위비트는 0으로 채워진다.
unsigned char ucx = 0b00000101; ucx >>= 2; // 0b00000001 이 된다. |
만약 부호가 있는 데이터형 변수 (char) ca=-2 이라면 2진수로 표현하면 0b11111110 이다. 이것을 cA>>=1 연산을 한 결과는 0b11111111이 된다 (십진수로는 –1이다.). 이 경우는 부호가 있는 데이터형이기 때문에 최상위 비트가 원래 부호비트값인 1로 채워지는 것이다.
char ca = -2; // 이진수로 0b11111110 이다. ca >>= 1; // 0b11111111 (십진수로 -1) 이 된다. |
다음 예제를 입력하고 결과를 확인해 보자.
#include "stdio.h"typedef unsigned char uchar;int main(){uchar ucA = 0x05, ucB, ucC;ucB = ucA << 3;ucC = ucA >> 1;printf("ucA : 0x%x\n", ucA);printf("ucB : 0x%x\n", ucB);printf("ucC : 0x%x\n", ucC);} |
ucA : 0x5ucB : 0x28ucC : 0x2 |
이진수로는 0b00000101, 0b00101000, 0b00000010 에 각각 해당된다.
C++ 강좌 전체 목록 >>>
'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글
C언어의 표준안들 개요 (0) | 2015.05.24 |
---|---|
1.4 C 프로그램 개발 과정 (0) | 2015.05.24 |
C/C++의 bitwise-not 연산 (~) (0) | 2015.05.20 |
C/C++의 bitwise-xor 연산 (^) (0) | 2015.05.20 |
C/C++의 bitwise-or 연산자 (|) (0) | 2015.05.20 |