Programing Language/Java
[Java] 비트 연산자(Bitwise Operators)
vinedpillar
2022. 5. 13. 17:45
비트 연산자
- 비트 연산자는 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자입니다.
- 컴퓨터는 기본적으로 2진수 기반으로 계산을 하는데 이를 이용해 논리 연산이나 이동 연산을 수행합니다.
- 비트 연산은 비트 단위의 조작을 통해 할 수 있는 몇몇 유용한 연산을 빠르게 수행하기 위해 사용됩니다.
비트 논리 연산자
- 비트 논리 연산자는 두 개의 피연산자를 대상으로 비트 단위의 논리 연산을 수행하는 연산자입니다.
- 때문에 비트 논리 연산은 0과 1로 저장되는 정수 타입만 피연산자가 될 수 있고, 부동 소수점 방식으로 저장되는 실수 타입은 피연산자가 될 수 없습니다.
- 비트 논리 연산자의 종류
- AND(&): 두 비트가 모두 1일 경우에만 1을 반환
- OR(|): 두 비트 중 하나만 1이어도 1을 반환
- XOR(^): 두 비트가 서로 다를 경우에 1 반환
- NOT(~): 비트의 반대 값을 반환
- 비트 논리 연산 표 정리
구분 | 피연산자1 | 피연산자2 | 결과 |
AND | 1 | 1 | 1 |
1 | 0 | 0 | |
0 | 1 | 0 | |
0 | 0 | 0 | |
OR | 1 | 1 | 1 |
1 | 0 | 1 | |
0 | 1 | 1 | |
0 | 0 | 0 | |
XOR | 1 | 1 | 0 |
1 | 0 | 1 | |
0 | 1 | 1 | |
0 | 0 | 0 | |
NOT | - | 1 | 0 |
- | 0 | 1 |
비트 논리 연산 예시
// 10진수 45는 2진수 00101101
byte val1 = 45;
// 10진수 25는 2진수 00011001
byte val2 = 25;
// result1에 9(00001001) 저장
int result1 = num1 & num2;
// result2에 61(00111101) 저장
int result2 = num1 | num2;
// result3에 52(00110100) 저장
int result3 = num1 ^ num2;
비트 이동 연산자
- 비트 이동 연산자는 비트를 좌측, 혹은 우측으로 밀어 이동시키는 연산을 수행합니다.
- 비트 이동 연산자의 종류
- [피연산자1] << [피연산자2] : 피연산자1(수)의 각 비트를 피연산자2(수)만큼 왼쪽으로 이동시키고 빈자리는 0으로 채웁니다.
- [피연산자1] >> [피연산자2] : 피연산자1(수)의 각 비트를 피연산자2(수)만큼 오른쪽으로 이동시키고 빈자리는 최상위 비트와 동일한 비트로 채웁니다.
- [피연산자1] >>> [피연산자2] : 피연산자1(수)의 각 비트를 피연산자2(수)만큼 오른쪽으로 이동시키고 빈자리는 0으로 채웁니다.
- 비트를 왼쪽으로 이동하는 것은 2ⁿ 만큼 곱하는 것과 동일합니다.
- 비트를 오른쪽으로 이동하는 것은 2ⁿ 만큼 나누는 것과 동일합니다.
(>>와 >>>연산의 차이는 양수일 때는 동일하고, 음수일 때만 차이가 발생)
- [피연산자1] << [피연산자2] : 피연산자1(수)의 각 비트를 피연산자2(수)만큼 왼쪽으로 이동시키고 빈자리는 0으로 채웁니다.
비트 이동 연산자 예시 코드
int num1 = 8;
int num2 = -8;
// result1에 64 저장
// 8 x 2³
int result1 = num1 << 3;
// result2에 1 저장
// 8 ÷ 2³
int result2 = num1 << 3;
// result3에 536,870,911 저장
int result3 = num2 >>> 3;
비트 연산의 복합 대입
- 산술 연산과 마찬가지로 비트 연산도 복합 대입 연산을 지원합니다.
- 비트 연산 복합 대입의 종류
- [변수] &= [피연산자] : 변수의 값과 피연산자의 값을 바탕으로 & 연산을 수행한 후에 다시 변수에 저장합니다.
- [변수] |= [피연산자] : 변수의 값과 피연산자의 값을 바탕으로 | 연산을 수행한 후에 다시 변수에 저장합니다.
- [변수] ^= [피연산자] : 변수의 값과 피연산자의 값을 바탕으로 ^ 연산을 수행한 후에 다시 변수에 저장합니다.
- [변수] <<= [피연산자] : 변수의 값과 피연산자의 값을 바탕으로 << 연산을 수행한 후에 다시 변수에 저장합니다.
- [변수] >>= [피연산자] : 변수의 값과 피연산자의 값을 바탕으로 >> 연산을 수행한 후에 다시 변수에 저장합니다.
- [변수] >>>= [피연산자] : 변수의 값과 피연산자의 값을 바탕으로 >>> 연산을 수행한 후에 다시 변수에 저장합니다.
비트 연산 복합 대입 예시
// 변수 num에 24 대입
int num = 24;
// 변수 num과 13을 AND 연산하고 다시 저장
// 현재 상태: num에 8 저장
num &= 13;
// 변수 num과 78을 OR 연산하고 다시 저장
// 현재 상태: num에 78 저장
num |= 78;
// 변수 num과 49를 XOR 연산하고 다시 저장
// 현재 상태: num에 127저장
num ^= 49;
// 변수 num에서 2만큼 왼쪽으로 비트를 쉬프트
// 현재 상태: num에 508저장
num <<= 2;
// 변수 num에서 3만큼 오른쪽으로 비트를 쉬프트
// 현재 상태: num에 63저장
num >>= 3;
// 변수 num에 1만큼 오른쪽으로 비트를 쉬프트
// (피연산자가 양수일 때는 >>와 동일한 연산 수행)
// 현재 상태: num에 31저장
num >>>= 1;
비트 연산자의 용도
- AND: 특정 비트를 소거하는데 사용할 수 있습니다.
- OR: 특정 비트를 1로 세팅하는데 사용할 수 있습니다.
- XOR: 비트를 토글하는데 사용할 수 있습니다.
- NOT: 비트의 보수 값을 구하는데 사용할 수 있습니다.
- <<: 2배 곱하기 연산에 사용할 수 있습니다.
- >>: 2배 나눗셈 연산에 사용할 수 있습니다.