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
'IT > Java' 카테고리의 다른 글
[Java] 삼항(조건) 연산자 (0) | 2024.02.21 |
---|---|
[Java] 대입 연산자 (0) | 2024.02.21 |
[Java] 논리 연산자 (0) | 2024.02.21 |
[Java] 비교 연산자 (0) | 2024.02.21 |
[Java] 나눗셈 연산 후 NaN과 Infinity (0) | 2024.02.21 |