java의 bit 연산자 중에 >>와 >>> 연산자가 있습니다. 이 둘의 차이에 대해 간단하게 알아보겠습니다.

 


 먼저, 위에 2개는 -2 >> 1과 -2 >>> 1의 값을 출력합니다. 아래 2개는 2 >> 1과 2 >>> 1을 출력합니다.

 

 출력 결과를 봅시다. -1, 2147483647이 나오고, 밑에 2개는 1, 1이 나옵니다. 이게 어떻게 된 것일까요?

 

 


 먼저 -2의 2의 보수 표현법으로 표기해 봅시다.

 

 2를 2진법으로 표현하면 위 그림과 같습니다. 여기서 비트가 0인 것은 1로 바꾸고, 1인 것은 0으로 바꿔보겠습니다.

 

 그러면 1...1101이 됩니다. 여기서 1을 더해보겠습니다.

 

 그러면 11..110이 됩니다. 여기에서, 부호를 결정하는 비트는 1로 표시했습니다. t가 -2인 경우, 표현 방식은 위와 같습니다. 이제, -2 >> 1과 -2 >>> 1의 차이를 알아봅시다. 먼저, >> 연산자는 부호도 그대로 가지고 옵니다. 맨 처음의 부호에 따라서 채워지는 비트가 정해진다는 것입니다.

 

 

 일단 모든 비트를 오른쪽으로 하나씩 이동시켜 보겠습니다. 그러면 위 그림과 같이 되겠네요. t >> 1은 부호 비트에 따라서 좌측에 채워지는 비트가 결정됩니다. 위의 경우는 부호 비트가 1이므로, 1이 채워지게 됩니다.

 

 

 그러면 요래 채워지겠군요. 반면에 >>> 1은 아래와 같이 동작합니다.

 

 

 채워지는 비트가 0이 됩니다. 앞에 붙은 게 1이냐 0이냐 상관 없이요. 그리고 32bit 자료형에서 01...1 패턴은 2147483647입니다. 맨 앞의 부호 비트에 따라서 앞에 붙어 있는 bit가 달라지는  >> 와는 다른 점이기도 합니다. t=2인 경우 t >> 1과 t >>> 1의 결과는 같을까요?

 

 

 먼저 t >> 1입니다. 0...010이 오른쪽으로 1칸씩 이동합니다. 다음에, 부호를 판정하는 비트가 0이였기 때문에 나머지 부분은 0으로 채워집니다. t >>> 1은 어떨까요? 앞에 부호가 1이던 0이던 무조건 0으로 채워지기 때문에 결과가 같게 됩니다.

 

 


 이제 이 경우는 어떨까요?

 

 

 -5는 111...1011 패턴으로 채워집니다. 이걸 2칸 오른쪽으로 옮기면 위 그림과 같이 됩니다. t >> 2의 경우에는 어떻게 처리될까요? 맨 앞의 부호 비트가 1이였기 때문에, 앞에 2개가 1로 채워집니다.

 

 

 11...10 패턴이네요. 0을 1로, 1을 0으로 바꾼 다음에 1을 더해 봅시다. 그러면 00...01에 1을 더했으므로, 00..010이 됩니다. 2가 되네요. 앞의 부호 비트가 1이므로 -2가 되겠습니다.

 

 반면 t >>> 2는 앞에 2개를 0으로 채워버립니다. 앞의 부호 비트가 1이여도요. 00111...10은 2^30-2입니다. 1073741822가 됩니다.

 

 결과를 보면 위와 같습니다.