본문 바로가기

Language/C#

쉬프트 연산자(shift operator)를 사용하는 방법


쉬프트 연산자(shift operator)는 변수 또는 식의 비트들을 왼쪽 또는 오른쪽으로 이동시키는 연산자입니다. 종류는 다음과 같습니다.

 

 

쉬프트 연산자의 종류

 

쉬프트

연산자

형식

의미

expr1이 부호없는 수일 때

expr1이 부호있는 수일 때

<<

expr1 << expr2

expr1의 비트들을 expr2의 값만큼 왼쪽으로 이동시킵니다. 맨 왼쪽 비트를 벗어나는 비트값들은 버려집니다. 이동 후 빈자리의 비트들은 0으로 채워집니다.

expr1이 부호없는 수일 때와 동일합니다.

>>

expr1 >> expr2

expr1의 비트들을 expr2의 값만큼 오른쪽으로 이동시킵니다. 맨 오른쪽 비트를 벗어나는 비트값들은 버려집니다. 이동 후 빈 자리의 비트들은 0으로 채워집니다.

비트들이 오른쪽으로 이동하는 것은 동일합니다. 그러나 이동 후 빈 자리들은 부호 비트의 값으로 채워집니다. 예를 들어 부호 비트가 1이면, 빈 자리들은 1로 채워집니다.

 

 

쉬프트 연산자의 오른쪽 피연산자는 정수형

한가지 주의할 점은 쉬프트 연산자의 오른쪽 피연산자(위 표에서는 expr2가 이에 해당)는 반드시 정수형이어야 한다는 점입니다. 그렇지 않으면 컴파일러는 오류 메시지를 보여줍니다. 예를 들어보죠.

 

using System;

 

class Program
{
    static void Main(string[] args)
    {
        int num = 333, num2;
        num2 = num >> 2.5;
    }
}

 

위와 같이 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