비트 연산자는 정수를 2진수 비트 단위로 직접 조작할 수 있게 해주는 연산자다.
평소에는 자주 쓰이지 않지만, 알고리즘 문제, 성능 최적화, 비트 마스킹 등에 매우 유용하다.
주요 비트 연산자
| 연산자 | 이름 | 설명 |
|---|
& | AND | 두 비트가 모두 1이면 1, 아니면 0 |
| | | OR | 두 비트 중 하나라도 1이면 1 |
^ | XOR | 두 비트가 다르면 1, 같으면 0 |
~ | NOT | 비트를 반전 (1 → 0, 0 → 1) |
<< | 왼쪽 시프트 | 비트를 왼쪽으로 이동, 빈 자리는 0으로 채움 |
>> | 오른쪽 시프트 | 부호 유지하며 오른쪽으로 이동 (음수는 1 유지) |
>>> | 논리적 시프트 | 부호 무시하고 오른쪽으로 이동, 빈 자리는 0 |
비트 연산 예제
int a = 5;
int b = 3;
System.out.println(a & b);
System.out.println(a | b);
System.out.println(a ^ b);
System.out.println(~a);
시프트 연산자 예제
int n = 8;
System.out.println(n << 1);
System.out.println(n >> 1);
활용 예시
int x = 7;
if ((x & 1) == 1) {
System.out.println("홀수");
} else {
System.out.println("짝수");
}
int x = 4;
System.out.println(x << 1);
System.out.println(x >> 1);
int READ = 1;
int WRITE = 2;
int EXECUTE = 4;
int permission = READ | WRITE;
boolean canWrite = (permission & WRITE) != 0;
System.out.println(canWrite);
'>>' vs '>>>' 차이점
| 연산자 | 이름 | 설명 |
|---|
>> | 산술 시프트 | 부호 비트 유지하며 오른쪽 이동 (음수 유지) |
>>> | 논리 시프트 | 부호 무시, 비어있는 자리를 0으로 채움 |
'>>>' 예제
int a = -8;
System.out.println(a >> 2);
System.out.println(a >>> 2);
- a >> 2: 산술 시프트 → 부호 유지 → 여전히 음수
- a >>> 2: 부호 무시, 왼쪽에 0을 채움 → 매우 큰 양수로 나옴
>>>는 부호 없는 시프트를 하기 때문에, 음수를 양수로 바꿀 수도 있다.
| 표현 | 비트값 (상위 비트 예시) | 결과 값 |
|---|
a = -8 | 11111111 11111111 11111111 11111000 | -8 |
a >> 2 | 11111111 11111111 11111111 11111110 | -2 (부호 유지) |
a >>> 2 | 00111111 11111111 11111111 11111110 | 1073741822 (부호 제거) |