TIL
- shift operator
- left shift
- right shift
- unsigned right shift
shift operator
- 이항 연산자이다.
- 부호비트 유지
- 쉬프트 방향에 따라 1bit 당
x2 또는 /2의 효과
- 자바는 최소 int 단위로 연산을 수행한다.
- shift operator를 비트에서 확인하기 위해서는 4byte(32bit, int형 byte 수)로 변환하여 고려해야한다.
left shift (<<)
- 모든 비트가 지정된 숫자만큼 왼쪽으로 이동한다.
A << B 라고 표시하며 A를 왼쪽으로 B만큼 비트 이동 시키라는 의미이다.
- 위 그림은
5 << 2 라고 표시하며 10진수 5를 왼쪽으로 2만큼 비트 이동 시키라는 의미이다.
- 부호비트는 유지하고 그 뒤에 있는 2개의 비트를 삭제한다.
- 비트들이 앞으로 당겨지면서 맨 앞에 위치한 비트 2개는 비어지게 되는데 0으로 채운다.
- 💡
A << B 연산의 결과 값은 A * 2^B한 결과와 같다.
- 결과값을 구하는 방식이 양수와 음수가 동일하다. (부호유지)
right shift (>>)
- 모든 비트가 지정된 숫자만큼 오른쪽으로 이동한다.
A >> B라고 표시하며 A를 오른쪽으로 B만큼 비트 이동 시키라는 의미이다.
- 위 그림은
5 >> 2 라고 표시하며 10진수 5를 오른쪽으로 2만큼 비트 이동 시키라는 의미이다.
- 부호비트는 유지하고 그 뒤에 있는 2개의 빈 비트에 부호비트 값을 채운다.
- 비트들이 뒤로 당겨지면서 맨 뒤에 위치한 비트 2개는 삭제된다.
- 💡
A >> B 연산의 결과 값은 A / 2^B한 결과와 같다.
- 결과값을 구하는 방식이 양수와 음수가 다르다.
- 부호유지는 똑같음
- 양수는 소수버림, 음수는 소수올림
5 >> 2 = 1 (5 / 4 = 1.25 -> 1)
-5 >> 2 = -2 (-5 / 4 = 1.25 -> 2)
unsigned right shift (>>>)
- 부호비트 상관없이 shift를 수행한다.
- 부호비트가 유지되지 않으니 변화가 생길 수 있고 변화에 따라 결과값의 부호가 바뀔 수 있다.
- 위 그림에서도
-128 >>> 2 연산하면 결과값이 32로 부호에 변동이 생겼다. (- -> +)
예제
System.out.println(5<<2); // 20
System.out.println(5>>2); // 1
System.out.println(-5>>2); // -2
System.out.println(0xffffffff>>>31); // 1(주어진 16진수 값을 2진수로 바꾸면 32비트)
📚 참고
https://www.youtube.com/watch?v=-iX1mcwiz5k