IT/Java

[Java] 비트 논리 연산자 / 비트 이동 연산자

Huitopia 2024. 2. 21. 14:22
728x90

비트 논리 연산자

비트 논리 연산자는 bit 단위로 논리 연산을 수행한다. 0과 1이 피연산자가 되므로 2진수 0과 1로 저장되는 정수타입(byte, short, int, long)만 피연산자가 될 수 있고, 부동 소수점 방식으로 저장되는 실수 타입(float, double)은 피연산자가 될 수 없다.

구분 연산식 결과 설명
AND
(논리곱)
1 & 1 1 두 비트 모두 1일 경우에만 결과 1
1 0 0
0 1 0
0 0 0
OR
(논리합)
1 | 1 1 두 비트 중 하나만 1이면 결과 1
1 0 1
0 1 1
0 0 0
XOR
(배타적 논리합)
1 ^ 1 0 두 비트 중 하나는 1이고 다른 하나가 0일 경우 결과 1
1 0 1
0 1 1
0 0 0
NOT(논리 부정)   ~ 1 0 보수
    0 1

 

byte num1 = 45;
byte num2 = 25;
int result = num1 & num2;

비트 논리 연산자는 byte, short, char 타입 피연산자를 int 타입으로 자동 변환 후 연산을 수행하기 때문에 int 변수에 대입해야 에러가 없다.

 

Byte.toUnsignedInt()

byte를 int 데이터 유형으로 변환시 비트 논리 곱(&)을 사용했지만, 좀 더 편하게 코드 한줄로 byte를 int데이터 유형으로 변환한다.

byte byteData = -120;
int intData = Byte.toUnsignedInt(byteData); // 136

 

예제 코드

package ch03.sec08;

public class BitLogicExample {
    public static void main(String[] args) {
        System.out.println("45 & 25 = " + (45 & 25)); // 9
        System.out.println("45 | 25 = " + (45 | 25)); // 61
        System.out.println("45 ^ 25 = " + (45 ^ 25)); // 52
        System.out.println("----------");

        byte receiveData = -120;

// 비트 논리곱 연산으로 Unsigned 정수 얻기
        int i1 = receiveData & 255;
        System.out.println("i1 = " + i1); // 136
        
// 자바 API를 이용해서 Unsigned 정수 얻기
        int i2 = Byte.toUnsignedInt(receiveData);
        System.out.println("i2 = " + i2); // 136

        int test = 136;
        byte test2 = (byte) test;
        System.out.println("test2 = " + test2); // -120

    }
}

 

 


비트 이동 연산자

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

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

 

예제 코드 1

    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); // 8
        System.out.println("result2 = " + result2); // 8

        int num2 = -8;
        int result3 = num2 >> 3;
        int result4 = num2 / (int) Math.pow(2, 3);
        System.out.println("result3 = " + result3); // -1
        System.out.println("result4 = " + result4); // -1
    }

 

예제 코드 2

    public static void main(String[] args) {
        /*
         *  00000000 = 0
         *  00000000 = 0
         *  00000011 = 3
         *  00000100 = 4
         */
        int val = 772;

        byte byte1 = (byte) (val >> 24);
        int int1 = byte1 & 255;
        System.out.println("첫 번째 바이트 부호 없는 값 : " + int1); // 0

        byte byt2 = (byte) (val >> 16);
        int int2 = Byte.toUnsignedInt(byt2);
        System.out.println("두 번째 바이트 부호 없는 값 : " + int2); // 0

        byte byte3 = (byte) (val >>> 8);
        int int3 = byte3 & 255;
        System.out.println("세 번째 바이트 부호 없는 값 : " + int3); // 3

        byte byte4 = (byte) val;
        int int4 = Byte.toUnsignedInt(byte4);
        System.out.println("네 번째 바이트 부호 없는 값 : " + int4); // 4
    }

 

728x90