본문 바로가기
언어/JAVA

[연산자] 비트 논리/이동 연산자, 대입/삼항 연산자, 연산의 우선순위

by 코딩맛집 2023. 1. 14.

3.8 비트 논리 연산자

비트 논리 연산은 소형 임베디드 장치의 C 프로그램에서 외부 서버의 자바 프로그램으로 데이터를 전달한다고 가정하자. C 언어에는 unit8_t 타입이 있는데, 이 타입은 1byte 크기를 가지면서 0~255 값의 범위를 가진다. C 프로그램이  unit8_t 타입 136을 2 진수로 보내면, 자바는 2진수를 -120으로 읽게 된다. 그 이유는 자바는 최상위 비트가 1이면 음수로 인식하기 때문이다. -120을 . C 프로그램이 보낸 136으로 복원하고 싶다면 자바에서 Byte.toUnsignedInt()코드를 사용한다.

 

 

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

 

1은 true, 0은 false라고 생각한다면 논리 연산자와 차이가 없다.

비트 논리 연산자도 연산을 수행하면 결과가 int 타입이 된다.

byte num1 = 45;
byte num2 = 25;
byte result = num1 & num2; //컴파일 에러
int result = num1 & num2;

 

3.9 비트 이동 연산자

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

public class Main {
    public static void main(String[] args) {
        int num1 = 1;
        int result1 = num1 << 3;
        int result2 = num1 * (int) Math.pow(2,3); 
        // Math.pow(2,3)은 2^3을 연산하고, double값을 산출한다.
        // int 값으로 얻고 싶다면 (int)로 캐스팅해야 한다.

        System.out.println("result1 : " + result1);
        System.out.println("result2 : " + result2);
    }
}

//출력 : result1 : 8
//       result1 : 8
// [00000000] [00000000] [00000011] [00000100] (772)
public class Main {
    public static void main(String[] args) {
        int value = 772;

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

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

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

        byte byte4 = (byte) value;
        int int4 = Byte.toUnsignedInt(byte4);

        System.out.println("네 번째 바이트 부호 없는 값: " + int4);
    }
}

//출력 : 첫 번째 바이트 부호 없는 값 : 0
//      두 번째 바이트 부호 없는 값 : 0
//      세 번째 바이트 부호 없는 값 : 3
//      네 번째 바이트 부호 없는 값 : 4

 

3.10 대입 연산자

대입 연산자는 우측 피연산자의 값을 좌측 피연산자인 변수에 대입한다. 단순 대입 연산자와 복합 대입 연산자가 있다.

3.11 삼항(조건) 연산자

삼항 연산자는 총 3개의 피연산자를 가진다. ? 앞의 피연산자는 boolean 변수 또는 조건식이 오므로 조건 연산자라고도 한다. 이 값이 true이면 콜론(:) 앞의 피연산자가 선택되고, false이면 콜론 뒤의 피연산자가 선택된다.

 

3.12 연산의 방향과 우선순위

여러 가지 연산자들이 섞여 있다면, 먼저 처리해야 할 연산을 괄호 ()로 묶는 것을 추천한다. ()는 최우선 순위를 가지기 때문이다.