프로그래밍 기술/안드로이드

[안드로이드] 20. Java - 쉬프트 연산

언제나휴일 2016. 4. 16. 19:59
반응형

쉬프트 연산

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

왼쪽 쉬프트 연산을 하면 좌항에 있는 피연산자의 값이 우항에 있는 수만큼 왼쪽으로 자리 이동합니다.
빈 자리는 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
 1
111 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 

반응형