쉬프트 연산자 (<< >>)는 피 연산자의 각 자리를 오른쪽(>>) 왼쪽(<<)으로 이동 한다고 해서 쉬프트 연산자(shift operator)라고 이름을 붙였다.
Ex) "8 << 2"
- 10진수 8은 2진수로 '00001000'이다.
- 8<<2은 10진수 8의 2진수를 왼쪽으로 2자리 이동시킨다. '(00)001000'
- 자리이동으로 인한 저장범위를 벗어난 값은 버려지고, 빈자리는 0으로 채워진다.
- 음수인 경우 1로 채워지고 양수인 경우 0으로 채워진다.
- '8<<2'의 결과는 2진수 '00100000' (10진수 32)가 된다.
private static String toBinaryString(int x) {
String zero = "00000000000000000000000000000000";
String temp = zero + Integer.toBinaryString(x);
return temp.substring(temp.length()-32);
}
public static void main(String[] args) {
int dec = 8;
System.out.printf("%d >> %d = %4d \t%s%n",
dec, 0, dec >> 0, toBinaryString(dec >> 0));
System.out.printf("%d >> %d = %4d \t%s%n",
dec, 1, dec >> 1, toBinaryString(dec >> 1));
System.out.printf("%d >> %d = %4d \t%s%n",
dec, 2, dec >> 2, toBinaryString(dec >> 2));
System.out.printf("%d << %d = %4d \t%s%n",
dec, 0, dec << 0, toBinaryString(dec << 0));
System.out.printf("%d << %d = %4d \t%s%n",
dec, 1, dec << 1, toBinaryString(dec << 1));
System.out.printf("%d << %d = %4d \t%s%n",
dec, 2, dec << 2, toBinaryString(dec << 2));
System.out.println();
dec=-8;
System.out.printf("%d >> %d = %4d \t%s%n",
dec, 0, dec >> 0, toBinaryString(dec >> 0));
System.out.printf("%d >> %d = %4d \t%s%n",
dec, 1, dec >> 1, toBinaryString(dec >> 1));
System.out.printf("%d >> %d = %4d \t%s%n",
dec, 2, dec >> 2, toBinaryString(dec >> 2));
System.out.printf("%d << %d = %4d \t%s%n",
dec, 0, dec << 0, toBinaryString(dec << 0));
System.out.printf("%d << %d = %4d \t%s%n",
dec, 1, dec << 1, toBinaryString(dec << 1));
System.out.printf("%d << %d = %4d \t%s%n",
dec, 2, dec << 2, toBinaryString(dec << 2));
System.out.println();
dec = 8;
System.out.printf("%d >> %2d = %4d \t%s%n",
dec, 0, dec >> 0, toBinaryString(dec >> 0));
System.out.printf("%d >> %2d = %4d \t%s%n",
dec, 32, dec >> 32, toBinaryString(dec >> 32));
}
//결과
8 >> 0 = 8 00000000000000000000000000001000
8 >> 1 = 4 00000000000000000000000000000100
8 >> 2 = 2 00000000000000000000000000000010
8 << 0 = 8 00000000000000000000000000001000
8 << 1 = 16 00000000000000000000000000010000
8 << 2 = 32 00000000000000000000000000100000
-8 >> 0 = -8 11111111111111111111111111111000
-8 >> 1 = -4 11111111111111111111111111111100
-8 >> 2 = -2 11111111111111111111111111111110
-8 << 0 = -8 11111111111111111111111111111000
-8 << 1 = -16 11111111111111111111111111110000
-8 << 2 = -32 11111111111111111111111111100000
8 >> 0 = 8 00000000000000000000000000001000
8 >> 32 = 8 00000000000000000000000000001000
이해를 위해 값이 바뀌는 것을 확인해야한다.
public static void main(String[] args) {
int dec = 1234;
int hex = 0xABCD;
int mask = 0xF;
System.out.printf("hex=%X%n", hex);
System.out.printf("%X%n", hex & mask);
hex = hex >>4;
System.out.printf("%X%n", hex & mask);
hex = hex >>4;
System.out.printf("%X%n", hex & mask);
hex = hex >>4;
System.out.printf("%X%n", hex & mask);
}
//결과
hex=ABCD
D
C
B
A
출처 : JAVA의 정석 - (남궁성지음)