본문 바로가기

Java/Java SE, EE

[Java/Java SE, EE] 비트 시프트 연산자

비트 시프트 연산자

비트 시프트 또는 비트 이동 연산자는 정수 타입의 데이터 비트를 좌측 또는 우측으로 이동시키는 연산자입니다.

구분 연산자 항의 개수 연산식 결과
비트 시프트 << 이항 피연산자의 비트를 좌측으로 다른 피연산자 만큼 이동
비트 시프트 >> 이항 피연산자의 비트를 우측으로 다른 피연산자 만큼 이동
비트 시프트 >>> 이항 피연산자의 비트를 우측으로 다른 피연산자 만큼 이동

<< 연산자

피연산자의 비트를 좌측으로 다른 피연산자 만큼 이동합니다.  비트의 이동은 연산자의 방향과 같습니다.

연산자 산출 전 비트
<< 3 0 0 0 0 0 0 1 0
산출 후 비트 0 0 0 1 0 0 0 0

예시에서는 각 비트 값이 좌측으로 피연산자 값(3)만큼 이동합니다. 비트 시프트 이후 오른쪽의 빈 칸은 모두 0으로 채워집니다.

int v = Integer.parseInt("00000010", 2);
		
System.out.println(Integer.toBinaryString(v << 3));		// 0001 0000

<< 연산자의 특징은 피연산자 값만큼 원래 값이 두 배씩 증가합니다. 아래는 정수 1(초기 값)을 << 연산자의 피연산자 값을 1씩 늘렸을 때에 대한 산출 결과입니다.

연산자 산출 후 비트
2^0  = 1 초기 값 0 0 0 0 0 0 0 1
2^1 = 2 << 1 0 0 0 0 0 0 1 0
2^2 = 4 << 2 0 0 0 0 0 1 0 0
2^3 = 8 << 3 0 0 0 0 1 0 0 0
2^4 = 16 << 4 0 0 0 1 0 0 0 0

>> 연산자

피연산자의 비트를 우측으로 다른 피연산자 만큼 이동합니다. 비트의 이동은 연산자의 방향과 같습니다. 

연산자 산출 전 비트
>> 3 1 0 0 1 0 0 0 0
산출 후 비트 0 0 0 1 0 0 1 0

예시에서는 각 비트 값이 우측으로 피연산자 값(3)만큼 이동합니다. 비트 시프트 이후 왼쪽의 빈 칸은 최상위 부호 비트(MSB, Most Significant Bit)와 같은 값으로 채워집니다.

int v = Integer.parseInt("00010000", 2);

System.out.println(Integer.toBinaryString(v >> 3));       // 0000 0010

>> 연산자의 특징은 피연산자 값만큼 원래 값이 절반씩 감소합니다. 아래는 정수 16(초기 값)을 >> 연산자의 피연산자 값을 1씩 늘렸을 때에 대한 산출 결과입니다.

연산자 산출 후 비트
2^4 = 16 초기 값 0 0 0 1 0 0 0 0
2^3 = 8 >> 1 0 0 0 0 1 0 0 0
2^2 = 4 >> 2 0 0 0 0 0 1 0 0
2^1 = 2 >> 3 0 0 0 0 0 0 1 0
2^0 = 1 >> 4 0 0 0 0 0 0 0 1

>>> 연산자

>>> 연산자는 >> 연산자와 동일하게 동작합니다. 차이점은 왼쪽의 빈 칸이 모두 0으로 채워진다는 것입니다.

연산자 산출 전 비트
>>> 3 1 0 0 1 0 0 0 0
산출 후 비트 0 0 0 1 0 0 1 0

비트 시프트 정리

세 가지 비트 시프트 연산자를 간단하게 정리하면 다음과 같습니다.

연산자 이동 방향 빈 자리 연산식 결과
<< 좌측 항상 0으로 채움 피연산자의 비트를 좌측으로 다른 피연산자 만큼 이동
>> 우측 MSB와 동일한 비트를 채움 피연산자의 비트를 우측으로 다른 피연산자 만큼 이동
>>> 우측 항상 0으로 채움 피연산자의 비트를 우측으로 다른 피연산자 만큼 이동