쉬프트 연산자(shift operator)는 변수 또는 식의 비트들을 왼쪽 또는 오른쪽으로 이동시키는 연산자입니다. 종류는 다음과 같습니다.
쉬프트 연산자의 종류
쉬프트 연산자 | 형식 | 의미 | |
expr1이 부호없는 수일 때 | expr1이 부호있는 수일 때 | ||
<< | expr1 << expr2 | expr1의 비트들을 expr2의 값만큼 왼쪽으로 이동시킵니다. 맨 왼쪽 비트를 벗어나는 비트값들은 버려집니다. 이동 후 빈자리의 비트들은 0으로 채워집니다. | expr1이 부호없는 수일 때와 동일합니다. |
>> | expr1 >> expr2 | expr1의 비트들을 expr2의 값만큼 오른쪽으로 이동시킵니다. 맨 오른쪽 비트를 벗어나는 비트값들은 버려집니다. 이동 후 빈 자리의 비트들은 0으로 채워집니다. | 비트들이 오른쪽으로 이동하는 것은 동일합니다. 그러나 이동 후 빈 자리들은 부호 비트의 값으로 채워집니다. 예를 들어 부호 비트가 1이면, 빈 자리들은 1로 채워집니다. |
쉬프트 연산자의 오른쪽 피연산자는 정수형
한가지 주의할 점은 쉬프트 연산자의 오른쪽 피연산자(위 표에서는 expr2가 이에 해당)는 반드시 정수형이어야 한다는 점입니다. 그렇지 않으면 컴파일러는 오류 메시지를 보여줍니다. 예를 들어보죠.
using System;
class Program |
위와 같이 Program.cs를 작성하면, 컴파일러는 다음과 같은 오류 메시지를 보여줍니다.
Operator '>>' cannot be applied to operands of type 'int' and 'double' |
왼쪽 쉬프트 연산의 예
아래 표는 short형 변수 signedNum에 왼쪽 쉬프트 연산을 적용 후 결과 값이 어떻게 되는지를 보여줍니다.
식 | 10진수 값 | 2진수 값 |
signedNum | 10554 | 00101001 00111010 |
signedNum << 1 | 21108 | 01010010 01110100 |
signedNum << 2 | -23320 | 10100100 11101000 |
signedNum << 3 | 18896 | 01001001 11010000 |
signedNum << 4 | -27744 | 10010011 10100000 |
signedNum << 5 | 10048 | 00100111 01000000 |
signedNum << 6 | 20096 | 01001110 10000000 |
signedNum << 7 | -25344 | 10011101 00000000 |
signedNum << 8 | 14848 | 00111010 00000000 |
signedNum << 9 | 29696 | 01110100 00000000 |
signedNum <<10 | -6144 | 11101000 00000000 |
signedNum << 11 | -12288 | 11010000 00000000 |
signedNum << 12 | -24576 | 10100000 00000000 |
signedNum << 13 | 16384 | 01000000 00000000 |
signedNum << 14 | -32768 | 10000000 00000000 |
signedNum << 15 | 0 | 00000000 00000000 |
signedNum << 16 | 0 | 00000000 00000000 |
오른쪽 쉬프트 연산의 예 - 왼쪽 피연산자가 부호 있는 수
아래 표는 short형 변수 signedNum에 오른쪽 쉬프트 연산을 적용 후 결과 값이 어떻게 되는지를 보여줍니다. 그 값은 양수인 경우와 음수인 경우로 나누어 봤습니다.
식 | 10진수 값 | 2진수 값 | 10진수 값 | 2진수 값 |
signedNum | 10554 | 00101001 00111010 | -10554 | 11010110 11000110 |
signedNum >> 1 | 5277 | 00010100 10011101 | -5277 | 11101011 01100011 |
signedNum >> 2 | 2638 | 00001010 01001110 | -2639 | 11110101 10110001 |
signedNum >> 3 | 1319 | 00000101 00100111 | -1320 | 11111010 11011000 |
signedNum >> 4 | 659 | 00000010 10010011 | -660 | 11111101 01101100 |
signedNum >> 5 | 329 | 00000001 01001001 | -330 | 11111110 10110110 |
signedNum >> 6 | 164 | 00000000 10100100 | -165 | 11111111 01011011 |
signedNum >> 7 | 82 | 00000000 01010010 | -83 | 11111111 10101101 |
signedNum >> 8 | 41 | 00000000 00101001 | -42 | 111111111 11010110 |
signedNum >> 9 | 20 | 00000000 00010100 | -21 | 11111111 11101011 |
signedNum >> 10 | 10 | 00000000 00001010 | -11 | 11111111 11110101 |
signedNum >> 11 | 5 | 00000000 00000101 | -6 | 11111111 11111010 |
signedNum >> 12 | 2 | 00000000 00000010 | -3 | 11111111 11111101 |
signedNum >> 13 | 1 | 00000000 00000001 | -2 | 11111111 11111110 |
signedNum >> 14 | 0 | 00000000 00000000 | -1 | 11111111 11111111 |
signedNum >> 15 | 0 | 00000000 00000000 | -1 | 11111111 11111111 |
signedNum >>16 | 0 | 00000000 00000000 | -1 | 11111111 11111111 |
오른쪽 쉬프트 연산의 예 - 왼쪽 피연산자가 부호 없는 수
이번에는 부호없는 수를 오른쪽 쉬프트한 결과의 예를 표로 보여줍니다.
식 | 10진수 값 | 2진수 값 |
unsignedNum | 54982 | 11010110 11000110 |
unsignedNum >> 1 | 27491 | 01101011 01100011 |
unsignedNum >> 2 | 13745 | 00110101 10110001 |
unsignedNum >> 3 | 6872 | 00011010 11011000 |
unsignedNum >> 4 | 3436 | 00001101 01101100 |
unsignedNum >> 5 | 1718 | 00000110 10110110 |
unsignedNum >> 6 | 859 | 00000011 01011011 |
unsignedNum >> 7 | 429 | 00000001 10101101 |
unsignedNum >> 8 | 214 | 00000000 11010110 |
unsignedNum >> 9 | 107 | 00000000 01101011 |
unsignedNum >> 10 | 53 | 00000000 00110101 |
unsignedNum >> 11 | 26 | 00000000 00011010 |
unsignedNum >> 12 | 13 | 00000000 00001101 |
unsignedNum >> 13 | 6 | 00000000 00000110 |
unsignedNum >> 14 | 3 | 00000000 00000011 |
unsignedNum >> 15 | 1 | 00000000 00000001 |
unsignedNum >> 16 | 0 | 00000000 00000000 |
'Language > C#' 카테고리의 다른 글
c# Oracle Procedure (0) | 2016.02.04 |
---|---|
msChart Y축 2개 쓰기 / double Y Asis (0) | 2016.02.04 |
파일이나 어셈블리 'Oracle.DataAccess' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. (0) | 2016.02.04 |
ibatis의 탄생 철학 (0) | 2016.02.04 |
IBatisNet.Common.Exceptions.ConfigurationException (0) | 2016.02.04 |