본문 바로가기

Java/Java SE, EE

[Java/Java SE, EE] 비트 논리 연산자

비트 논리 연산자

비트 논리 연산자(비트 연산자)에는 비트 부정(NOT), 비트 곱(AND), 비트 합(OR) 그리고 비트 배타적 논리 합(XOR)이 있습니다. 비트 논리 연산자는 피연산자가 정수 타입(byte, short, int, long)인 경우 사용 할 수 있습니다.

구분 연산자 항의 개수 연산식 결과
비트 논리 ~ 단항 비트 부정(NOT), 비트 값(0 또는 1)을 상호 반전
비트 논리 & 이항 비트 곱(AND), 두 피연산자의 각 비트 자릿수 별로 모두 1인 경우 1, 그렇지 않은 경우 0
비트 논리 | 이항 비트 합(OR), 두 피연산자의 각 비트 자릿수 별로 하나라도 1인 경우 1, 모두 0인 경우 0
비트 논리 ^ 이항 비트 배타적 논리 합(XOR), 두 피연산자의 각 비트 자릿수 별로 서로 다르면 1, 같으면 0

비트 부정(NOT)

비트 부정 연산자 또는 비트 반전 연산자라고 부릅니다. 단항 연산자에 속하며, 전위 연산자이기 때문에 피연산자의 왼쪽에 위치합니다. 피연산자를 2진수로 표현했을 때 비트 값(0 또는 1)을 상호 반전합니다. 최상위 비트를 포함하여 모든 비트가 반전된 값을 반환하기 때문에 부호가 반대인 값이 산출됩니다.

연산자 산출 전 비트 산출 후 비트
~ 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0

표에서 2진수 0000 1111은 10진수로 정수 15를 뜻합니다. 자바에서 2진수 String 타입을 10진수 int 타입으로, 또는 그 반대 방향으로 변환하기 위해서 Integer 래퍼 클래스의 함수를 사용합니다.

  • parseInt(String s, int radix)
    2진수 String 타입을 10진수 int 타입으로 변환합니다.
  • toBinaryString(int i)
    10진수 int 타입을 2진수 String 타입으로 변환합니다.

2진수 1111 0000은 10진수 15를 구성하며, 비트 부정(반전) 연산자를 처리하면 산출 결과가 10진수 정수 -16이 됩니다. 최상위 비트가 반전되었기 때문에 부호가 반대인 값이 산출된 것을 확인 할 수 있습니다.

int i = Integer.parseInt("00001111", 2);

System.out.println(Integer.toBinaryString(i));		// 0000 1111
System.out.println(Integer.toBinaryString(~i));		// 1111 0000

비트 곱(AND)

두 피연산자의 각 비트 자릿수 별로 모두 1인 경우 1, 그렇지 않은 경우 0을 반환합니다. 

연산자 산출 전 비트
&
0 0 0 0 1 1 1 1
1 1 0 0 1 1 0 0
산출 후 비트 0 0 0 0 1 1 0 0

다음은 표에서 두 피연산자의 비트 곱 연산 결과를 보여줍니다.

int a = Integer.parseInt("00001111", 2);
int b = Integer.parseInt("11001100", 2);

System.out.println(Integer.toBinaryString(a & b));    // 0000 1100

비트 합(OR)

두 피연산자의 각 비트 자릿수 별로 하나라도 1인 경우 1, 모두 0인 경우 0을 반환합니다.

연산자 산출 전 비트
| 0 0 0 0 1 1 1 1
1 1 0 0 1 1 0 0
산출 후 비트 1 1 0 0 1 1 1 1

다음은 표에서 두 피연산자의 비트 합 연산 결과를 보여줍니다.

int a = Integer.parseInt("00001111", 2);
int b = Integer.parseInt("11001100", 2);

System.out.println(Integer.toBinaryString(a | b));    // 1100 1111

비트 배타적 논리 합(XOR)

두 피연산자의 각 비트 자릿수 별로 서로 다르면 1, 같으면 0을 반환합니다.

연산자 산출 전 비트
^ 0 0 0 0 1 1 1 1
1 1 0 0 1 1 0 0
산출 후 비트 1 1 0 0 0 0 1 1

다음은 표에서 두 피연산자의 비트 배타적 논리 합 연산 결과를 보여줍니다.

int a = Integer.parseInt("00001111", 2);
int b = Integer.parseInt("11001100", 2);

System.out.println(Integer.toBinaryString(a ^ b));    // 1100 0011