비트 시프트 연산자
비트 시프트 또는 비트 이동 연산자는 정수 타입의 데이터 비트를 좌측 또는 우측으로 이동시키는 연산자입니다.
구분 | 연산자 | 항의 개수 | 연산식 결과 |
비트 시프트 | << | 이항 | 피연산자의 비트를 좌측으로 다른 피연산자 만큼 이동 |
비트 시프트 | >> | 이항 | 피연산자의 비트를 우측으로 다른 피연산자 만큼 이동 |
비트 시프트 | >>> | 이항 | 피연산자의 비트를 우측으로 다른 피연산자 만큼 이동 |
<< 연산자
피연산자의 비트를 좌측으로 다른 피연산자 만큼 이동합니다. 비트의 이동은 연산자의 방향과 같습니다.
연산자 | 산출 전 비트 | |||||||
<< 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으로 채움 | 피연산자의 비트를 우측으로 다른 피연산자 만큼 이동 |
'Java > Java SE, EE' 카테고리의 다른 글
[Java/Java SE, EE] 삼항(?:) 연산자 (0) | 2022.01.16 |
---|---|
[Java/Java SE, EE] 비트 마스크(Bitmask) (0) | 2022.01.16 |
[Java/Java SE, EE] 비트 논리 연산자 (0) | 2022.01.11 |
[Java/Java SE, EE] 논리 연산자 (0) | 2022.01.11 |
[Java/Java SE, EE] 부호(+, -) 연산자 (0) | 2022.01.10 |