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 연산의 방향과 우선순위
여러 가지 연산자들이 섞여 있다면, 먼저 처리해야 할 연산을 괄호 ()로 묶는 것을 추천한다. ()는 최우선 순위를 가지기 때문이다.
'언어 > JAVA' 카테고리의 다른 글
[제어문] 반복문(for문, while문, do-while문) (1) | 2023.01.16 |
---|---|
[제어문] 조건문(if문, switch문) (0) | 2023.01.16 |
[연산자] 정확한 계산, NaN과 Infinity, 비교 연산자, 논리 연산자 (2) | 2023.01.14 |
[연산자] 부호/증감 연산자, 산술 연산자, 오버플로우, 언더플로우 (0) | 2023.01.14 |
[변수] (0) | 2023.01.13 |