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한 결과와 같다.
  • 결과값을 구하는 방식이 양수와 음수가 동일하다. (부호유지)
    • 3 << 1 = 6
    • -3 << 1 = -6

 

 

 

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