3.9 비트 이동 연산자

비트 이동 연산자는 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 수행한다.

구분 연산식 설명
좌측 이동 a << b 정수 a의 각 비트를 b만큼 왼쪽으로 이동(빈자리는 0으로 채움)
우측 이동 a >> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동(빈자리는 최상위 부호 비트와 같은 값으로 채움)
  a >>> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동(빈자리는 0으로 채움)

a << b 연산은 a * 2^b와 같은 결과를 산출하고, a >> b 연산은 a / 2^b와 같은 결과를 산출한다.

[예제: BitShiftExample1.java]

package ch03.sec09;

public class BitShiftExample1 {
    public static void main(String[] args) {
        int num1 = 1;
        int result1 = num1 << 3;
        int result2 = num1 * (int) Math.pow(2, 3);
        System.out.println("result1: " + result1);
        System.out.println("result2: " + result2);
        
        int num2 = -8;
        int result3 = num2 >> 3;
        int result4 = num2 / (int) Math.pow(2, 3);
        System.out.println("result3: " + result3);
        System.out.println("result4: " + result4);
    }
}

실행 결과

result1: 8
result2: 8
result3: -1
result4: -1

이번에는 우측 이동 연산자(>>>)를 사용하여 정수 -8을 3비트만큼 오른쪽으로 이동시켜 보자.

int result = -8 >>> 3;
//00011111 11111111 11111111 11111111 (536870911)

32비트 전체를 오른쪽으로 3비트 이동할 때 맨 오른쪽 3비트는 밀려서 버려지고, 맨 왼쪽에 새로 생기는 3비트는 무조건 0으로 채워진다. 이렇게 변환된 2진수를 10진수로 변환하면 536870911 값을 얻는다.

다음은 int 타입 값 772를 구성하는 4개의 byte를 각각 별도로 읽고, 부호 없는 정수(0~255)로 출력하는 예제이다.

[예제: BitShiftExample2.java]

package ch03.sec09;

public class BitShiftExample2 {
    public static void main(String[] args) {
        int value = 772; // [00000000] [00000000] [00000011] [00000100]
        
        //우측으로 3byte(24bit) 이동하고 끝 1바이트만 읽음: [00000000]
        byte byte1 = (byte) (value >>> 24);
        int int1 = byte1 & 255;
        System.out.println("첫 번째 바이트 부호 없는 값: " + int1);
        
        //우측으로 2byte(16bit) 이동하고 끝 1바이트만 읽음: [00000000]
        byte byte2 = (byte) (value >>> 16);
        int int2 = Byte.toUnsignedInt(byte2);
        System.out.println("두 번째 바이트 부호 없는 값: " + int2);
        
        //우측으로 1byte(8bit) 이동하고 끝 1바이트만 읽음: [00000011]
        byte byte3 = (byte) (value >>> 8);
        int int3 = byte3 & 255;
        System.out.println("세 번째 바이트 부호 없는 값: " + int3);
        
        //끝 1바이트만 읽음: [00000100]
        byte byte4 = (byte) value;
        int int4 = Byte.toUnsignedInt(byte4);
        System.out.println("네 번째 바이트 부호 없는 값: " + int4);
    }
}

실행 결과

첫 번째 바이트 부호 없는 값: 0
두 번째 바이트 부호 없는 값: 0
세 번째 바이트 부호 없는 값: 3
네 번째 바이트 부호 없는 값: 4
서브목차