[Java] 비트 연산자

손주현·2025년 4월 4일
0

Java 기초

목록 보기
5/13
post-thumbnail

비트 연산자는 정수를 2진수 비트 단위로 직접 조작할 수 있게 해주는 연산자다.
평소에는 자주 쓰이지 않지만, 알고리즘 문제, 성능 최적화, 비트 마스킹 등에 매우 유용하다.


주요 비트 연산자

연산자이름설명
&AND두 비트가 모두 1이면 1, 아니면 0
|OR두 비트 중 하나라도 1이면 1
^XOR두 비트가 다르면 1, 같으면 0
~NOT비트를 반전 (1 → 0, 0 → 1)
<<왼쪽 시프트비트를 왼쪽으로 이동, 빈 자리는 0으로 채움
>>오른쪽 시프트부호 유지하며 오른쪽으로 이동 (음수는 1 유지)
>>>논리적 시프트부호 무시하고 오른쪽으로 이동, 빈 자리는 0

비트 연산 예제

int a = 5; // 00000101
int b = 3; // 00000011

System.out.println(a & b);  // 1  (00000001)
System.out.println(a | b);  // 7  (00000111)
System.out.println(a ^ b);  // 6  (00000110)
System.out.println(~a);     // -6 (11111010) 2의 보수

시프트 연산자 예제

int n = 8; // 00001000

System.out.println(n << 1); // 16 (00010000) → 왼쪽 시프트: *2
System.out.println(n >> 1); // 4  (00000100) → 오른쪽 시프트: /2

활용 예시

  • 짝수 / 홀수 판별
int x = 7;

if ((x & 1) == 1) {
    System.out.println("홀수");
} else {
    System.out.println("짝수");
}
  • 값을 2배 또는 반으로 만들기
int x = 4;

System.out.println(x << 1); // 8 (곱하기 2)
System.out.println(x >> 1); // 2 (나누기 2)
  • 비트 마스크 예시 (권한 체크)
int READ = 1;      // 0001
int WRITE = 2;     // 0010
int EXECUTE = 4;   // 0100

int permission = READ | WRITE; // 0011

// 권한 확인
boolean canWrite = (permission & WRITE) != 0;
System.out.println(canWrite); // true

'>>' vs '>>>' 차이점

연산자이름설명
>>산술 시프트부호 비트 유지하며 오른쪽 이동 (음수 유지)
>>>논리 시프트부호 무시, 비어있는 자리를 0으로 채움

'>>>' 예제

int a = -8; // 11111111 11111111 11111111 11111000 (32bit)

System.out.println(a >> 2);   // -2
System.out.println(a >>> 2);  // 1073741822
  • a >> 2: 산술 시프트 → 부호 유지 → 여전히 음수
  • a >>> 2: 부호 무시, 왼쪽에 0을 채움 → 매우 큰 양수로 나옴
  • >>>는 부호 없는 시프트를 하기 때문에, 음수를 양수로 바꿀 수도 있다.
표현비트값 (상위 비트 예시)결과 값
a = -811111111 11111111 11111111 11111000-8
a >> 211111111 11111111 11111111 11111110-2 (부호 유지)
a >>> 200111111 11111111 11111111 111111101073741822 (부호 제거)
profile
Clarinetist.dev

0개의 댓글