비트 단위 XOR(배타적 논리합, Exclusive OR)은 자바에서 "^" 기호로 표현되는 연산자입니다. 두 피연산자의 비트가 서로 다를 때는 1을, 두 비트가 같을 때는 0을 반환합니다. XOR는 두 개의 피연산자를 취하는 이항 연산자이며, 표현식을 왼쪽에서 오른쪽으로 평가합니다. 한 가지 유의할 점은 "^" 연산자는 String 타입의 피연산자에는 정의되어 있지 않아 직접 사용할 수 없다는 것입니다.
XOR 연산 규칙(진리표)
- false XOR false → false
- false XOR true → true
- true XOR false → true
- true XOR true → false
즉, XOR는 "두 값이 서로 다른가?"를 판별하는 연산이라고 이해하면 쉽습니다. boolean 타입에서는 비교 연산자 !=(같지 않음)와 항상 동일한 결과를 반환합니다.
예제 1: boolean 변수에 XOR 적용하기
public class XORTest1 {
public static void main(String[] args) {
boolean x = false;
boolean y = false;
boolean xXorY = x ^ y;
System.out.println("false XOR false: "+xXorY);
x = false;
y = true;
xXorY = x ^ y;
System.out.println("false XOR true: "+xXorY);
x = true;
y = false;
xXorY = x ^ y;
System.out.println("true XOR false: "+xXorY);
x = true;
y = true;
xXorY = x ^ y;
System.out.println("true XOR true: "+xXorY);
}
}
실행 결과
false XOR false: false false XOR true: true true XOR false: true true XOR true: false
실행 결과에서 볼 수 있듯이, 두 boolean 값이 서로 다를 경우에만 true가 출력됩니다.
예제 2: 문자열의 각 문자에 XOR 적용하기
String 타입 자체에는 "^" 연산자를 직접 사용할 수 없지만, charAt() 메서드로 꺼낸 char 값에는 적용할 수 있습니다. char는 내부적으로 정수(유니코드) 값으로 처리되기 때문에('0'은 48, '1'은 49), 두 문자의 코드 값이 같으면 0, 다르면 1이 됩니다. 이러한 성질을 활용하면 아래와 같이 2진 문자열 형태의 데이터에도 XOR 연산을 응용할 수 있습니다.
public class XORTest2 {
public static void main(String[] args) {
String str1 = "1010100101";
String str2 = "1110000101";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str1.length(); i++) {
sb.append(str1.charAt(i)^str2.charAt(i));
}
System.out.println(sb);
}
}
실행 결과
0100100000
두 문자열의 같은 위치에 있는 문자들을 하나씩 비교하여 서로 다르면 1, 같으면 0을 이어 붙인 값이 최종적으로 출력됩니다.