쉬프트 연산은 일상 생활에서 흔히 볼 수 있는 연산은 아니다. 비트 수준에서 이루어지는 계산이기 때문에 프로그래밍에서 접하는 것이 일반적이며, 성능이 우수하다.
쉬프트 연산자
쉬프트 연산자의 종류는 다음과 같다.
연산자
사용 예
설명
<<
a << n
a를 n만큼 left shift
>>
a >> n
a를 n만큼 right shift
>>>
a >>> n
a를 n만큼 unsigned right shift
쉬프트 연산 데모 1
importjava.lang.*;publicclassShiftOperator1{publicstaticvoidmain(String[]args){int a =7;int b = a >>2;int c = a <<2;int d = a >>>2;System.out.println("a = "+ a);System.out.println("b = "+ b);System.out.println("c = "+ c);System.out.println("d = "+ d);}}
출력 결과는 다음과 같다.
쉬프트 연산을 수행하기 위해서는 숫자를 비트 형태(2진수)로 변환하여 생각해야 한다.
변수
27
26
25
24
23
22
21
20
10진수
a
0
0
0
0
0
1
1
1
7
a를 bit로 바꾸어 보면 위와 같다. 알아보기 쉽도록 실제로 4byte(32bit)이지만 1byte(8bit)로 표기했다.
Left Shift란 각각의 비트를 왼쪽으로 한 칸씩 옮기는 것을 말한다. 범위를 넘어가는(overflow) 데이터는 버림 처리하며 빈칸은 0으로 채운다.
변수
27
26
25
24
23
22
21
20
10진수
a
0
0
0
0
0
1
1
1
7
a << 1
0
0
0
0
1
1
1
0
14
결론적으로 Left Shift를 한 번 수행할 때마다 2배씩 커지는 효과가 발생한다.
Right Shift란 각각의 비트를 오른쪽으로 한 칸씩 옮기는 것을 말한다. 범위를 넘어가는(overflow) 데이터는 버림 처리하며 빈칸은 기존의 자리에 있던 값으로 채운다.
변수
27
26
25
24
23
22
21
20
10진수
a
0
0
0
0
0
1
1
1
7
a >> 1
0
0
0
0
0
0
1
1
3
Unsigned Right Shift는 부호를 고려하지 않고 오른쪽으로 1비트씩 이동하는 것을 말한다. 이는 음수를 예로 들어 설명해야 이해할 수 있다.