개발/JAVA

JAVA 기초: 비트 연산자와 비트 시프트 연산자

예니03 2024. 12. 30. 11:46
반응형

Java에서 비트 연산자는 숫자를 이진수(0과 1)로 변환해 계산하는 특별한 도구입니다. 퍼포먼스 최적화나 시스템 프로그래밍에 주로 사용되며, 기본적인 논리 연산이나 데이터를 압축하는 데도 유용합니다. 이번 글에서는 비트 연산자와 비트 시프트 연산자를 간단한 예제와 함께 알아보겠습니다.

1. 비트 연산자 (Bitwise Operators)

비트 연산자는 숫자를 이진수(0과 1)로 변환해 각 비트를 비교하며 연산합니다.

주요 연산자

연산자 설명 예시

&논리곱 (AND)1 & 1 = 1, 1 & 0 = 0
|논리합(OR)1 | 1 = 1, 하나라도 1이면 1
^배타적 논리합 (XOR)1 ^ 0 = 1, 1 ^ 1 = 0
~비트 NOT (반전)~1 = 0, ~0 = 1

코드 예제 (bitOperTest)

byte b1 = 0b1101; // 2진수: 13
byte b2 = 0b0111; // 2진수: 7

int result = b1 & b2; // 비트 AND
System.out.println(Integer.toBinaryString(result)); // 출력: 101

result = b1 | b2; // 비트 OR
System.out.println(Integer.toBinaryString(result)); // 출력: 1111

result = b1 ^ b2; // 비트 XOR
System.out.println(Integer.toBinaryString(result)); // 출력: 1010

result = ~b1; // 비트 NOT
System.out.println(Integer.toBinaryString(result)); // 출력: 11111111111111111111111111110010
System.out.println(result); // 출력: -14 (10진수)

실행 결과

101
1111
1010
11111111111111111111111111110010
-14

초보자를 위한 이해 포인트

  • AND (&): 두 비트가 모두 1일 때만 결과가 1.
  • OR (|): 둘 중 하나라도 1이면 결과가 1.
  • XOR (^): 둘이 다를 때만 1.
  • NOT (~): 비트를 반전(0 → 1, 1 → 0).
  • ~의 결과는 부호가 반전되며 음수로 표시됩니다(2의 보수 표현).

 

2. 비트 시프트 연산자 (Bit Shift Operators)

비트 시프트 연산자는 비트를 왼쪽 또는 오른쪽으로 이동시키는 연산자입니다.

주요 연산자

연산자 설명 예시

<<왼쪽 시프트1 << 1 = 10 (2진수 2)
>>오른쪽 시프트 (부호 유지)1000 >> 1 = 100 (2진수 4)
>>>오른쪽 시프트 (부호 상관없음)음수의 경우도 0으로 채움

코드 예제 (bitShiftTest)

int val = 1; // 초기값: 1
System.out.println(val); // 출력: 1

// 왼쪽으로 1비트 이동
System.out.println(Integer.toBinaryString(val << 1)); // 출력: 10 (2진수)

// 왼쪽으로 4비트 이동
System.out.println(Integer.toBinaryString(val << 4)); // 출력: 10000 (2진수)

// 오른쪽 시프트
int val2 = 0b1000; // 2진수: 8
System.out.println(Integer.toBinaryString(val2)); // 출력: 1000

System.out.println(Integer.toBinaryString(val2 >> 1)); // 100 (2진수 4)
System.out.println(Integer.toBinaryString(val2 >> 3)); // 1 (2진수 1)

실행 결과

1
10
10000
1000
100
1

초보자를 위한 이해 포인트

  • 왼쪽 시프트 (<<): 비트를 왼쪽으로 밀면서 오른쪽에 0을 채웁니다. 값이 2배씩 커집니다.
    • 예: 1 << 1 → 2, 1 << 2 → 4.
  • 오른쪽 시프트 (>>): 비트를 오른쪽으로 밀면서 왼쪽에 부호를 유지. 값이 2배씩 작아집니다.
    • 예: 8 >> 1 → 4, 8 >> 3 → 1.

 

비트 연산자의 실제 활용 사례

  1. 플래그 설정 및 확인
    • 여러 상태를 하나의 정수 값으로 관리할 때 비트 연산을 사용합니다.
    • 예: 0001은 읽기 권한, 0010은 쓰기 권한, 0100은 실행 권한.
  2. 성능 최적화
    • 곱셈(*)이나 나눗셈(/) 대신 시프트 연산(<<, >>)을 사용해 연산 속도를 높일 수 있습니다.
    • 예: n * 2는 n << 1과 동일.
  3. 네트워크 프로그래밍
    • 데이터를 효율적으로 전송하기 위해 비트 연산으로 값을 압축하거나 복원.

 

마무리하며

비트 연산자는 간단한 숫자 계산을 넘어 더 효율적인 코드를 작성할 수 있는 도구입니다. 이번 글을 참고해 기본 개념을 익히고, 다양한 상황에서 활용해보세요! 😊
 

반응형