DEV-STUDY/Java

비트 비교연산자 짚고 넘어가기

HwangJerry 2024. 1. 15. 19:29

자바에는 다양한 연산자들이 있습니다. 그 중에서도 오늘은 비트 비교연산자에 대해 이야기해볼까 합니다. 비트연산자는 |, &, ^, ~, <<, >>, >>> 등이 있습니다. 이들은 각각 OR, AND, XOR, NOT, left shift, signed right shift, unsigned right shift 연산을 수행합니다. 이번 글에서는 이들 중에서도 |& 연산자에 대해 좀 더 자세히 알아보겠습니다.

비트 OR 연산자 (|)

비트 OR 연산자 (|)는 두 비트 중 하나라도 1이 있으면 결과는 1이 됩니다. 이 연산자는 논리 OR 연산자 (||)와 비슷해 보일 수 있지만, 중요한 차이가 있습니다. 논리 OR 연산자는 앞의 피연산자가 true일 경우 뒤의 피연산자를 평가하지 않습니다. 이를 "short-circuit" 연산이라고 합니다. 그러나 비트 OR 연산자는 두 피연산자 모두를 평가합니다.

다음은 이를 보여주는 예제 코드입니다.

int a = 15;
int b = 10;

System.out.println((a += 5) > 15 | (b -= 5) < 10); // true
System.out.println(a + ", " + b); // 20, 5

위 코드에서 (a += 5) > 15true이므로, 논리 OR 연산자 (||)를 사용했다면 (b -= 5) < 10은 실행되지 않았을 것입니다. 하지만 비트 OR 연산자를 사용했기 때문에 (b -= 5) < 10도 실행되고, b의 값이 5로 감소하는 것을 확인할 수 있습니다.

비트 AND 연산자 (&)

비트 AND 연산자 (&)는 두 비트 모두 1일 때만 결과가 1이 됩니다. 이 역시 논리 AND 연산자 (&&)와 비슷해 보일 수 있지만, 마찬가지로 중요한 차이가 있습니다. 논리 AND 연산자는 앞의 피연산자가 false일 경우 뒤의 피연산자를 평가하지 않습니다. 하지만 비트 AND 연산자는 두 피연산자 모두를 평가합니다.

다음은 이를 보여주는 예제 코드입니다.

int a = 15;
int b = 10;

System.out.println((a > b) & (b > 0)); // true

한번쯤은 짚어야 했다.

비트 비교연산자는 각 비트를 직접 조작하는데 사용되며, 논리 연산자와는 다른 동작 방식을 가지고 있습니다. 특히, short-circuit 연산을 수행하지 않는다는 점을 기억해두는 것이 중요합니다. 사실 개발 과정에서 그다지 많이 사용하지는 않는 것 같습니다만, 그래도 분명히 알아둘 필요성은 있어 보여서 정리해 보았습니다.