[Java] 2.2.5 쉬프트 연산

2.2.5 쉬프트 연산

쉬프트 연산은 좌항에 있는 피연산자를 우항에 있는 수만큼 비트 자리 이동하는 연산자로 << 는 왼쪽 쉬프트 연산자이고 >>와 >>> 는 오른쪽 쉬프트 연산자입니다.

왼쪽 쉬프트 연산을 하면 좌항에 있는 피연산자의 값이 우항에 있는 수만큼 왼쪽으로 자리 이동하는데 빈 자리는 0으로 채워집니다.

만약 3을 왼쪽으로 4자리 이동시키면 연산 결과는 48입니다. 설명을 위해 2진수로 얘기하면 이진수 011(10진수 3)을 왼쪽으로 4자리 이동하면 이진수 0110000(10진수 48)입니다.

3; 2진수 0000 0011, 10진수 3

0000 0000 0000 0000 0000 0000 0000 0011

3<<4; 2진수 0001 1000 , 10진수 48

0000 0000 0000 0000 0000 0000 0001 1000

오른쪽 쉬프트 연산은 >>와 >>>이 있습니다. >>는 빈 자리를 부호 비트로 채우는 쉬프트 연산이고 >>>는 빈 자리를 0을 채우는 쉬프트 연산입니다.

예를 들어 48을 >>을 이용하여 3자리 이동하면 연산 결과는 3입니다. 설명을 위해 2진수로 얘기하면 48의 부호 비트는 0이고 뒤쪽 8개의 비트는 0011 0000 입니다. 4자리 오른쪽으로 이동하면 빈자리는 0으로 채워지고 뒤쪽 8개의 비트는 0000 0011이므로 연산 결과는 3입니다. 또한 48을 >>>을 이용하여 3자리 이동해도 부호 비트가 0이므로 연산 결과는 똑같이 3입니다.

48; 2진수 0001 1000, 10진수 48

0000 0000 0000 0000 0000 0000 0000 0011

48>>4; 2진수 0000 0011 , 10진수 3

0000 0000 0000 0000 0000 0000 0001 1000

48>>>4; 2진수 0000 0011 , 10진수 3

0000 0000 0000 0000 0000 0000 0001 1000

하지만 음수를 오른쪽 쉬프트하면 >>와 >>>의 연산 결과가 다릅니다. 음수를 >> 연산으로 이동하면 빈 자리를 부호 비트에 있는 1로 채워지지만 >>>연산으로 이동하면 빈 자리를 0으로 채우기 때문에 연산 결과가 달라집니다.

-48; 2진수 부호 비트:1 뒤쪽 8비트 1110 1000, 10진수 -48

1111 1111 1111 1111 1111 1111 1110 1000

-48>>4; 빈자리를 부호 비트 1로 채움, 뒤쪽 8비트 1111 1110, 10진수 -3

1111 1111 1111 1111 1111 1111 1111 1110

-48>>>4; 빈자리를 0으로 채움, 뒤쪽 8비트 1111 1110, 10진수 268435453

0000 1111 1111 1111 1111 1111 1111 1111 1110

private static void exShift() {
    System.out.println("3<<4 : "+(3<<4));
    System.out.println("48>>4 : "+(48>>4));
    System.out.println("48>>>4 : "+(48>>>4));
    System.out.println("-48>>4 : "+(-48>>4));
    System.out.println("-48>>>4 : "+(-48>>>4));
}
3<<4 : 48
48>>4 : 3
48>>>4 : 3
-48>>4 : -3
-48>>>4 : 268435453