1. 概述

本文将深入讲解 Java 中的 XOR(异或)操作符。我们会先回顾 XOR 的基本逻辑原理,然后结合实际代码演示它在 Java 中的使用方式。内容简洁实用,适合有一定经验的开发者快速掌握核心要点,避免踩坑。

2. XOR 操作符的逻辑原理

XOR,全称 exclusive OR(异或),是一种逻辑运算,接收两个布尔值作为操作数,当且仅当两个操作数不同时返回 true,否则返回 false。

✅ 简单来说:

  • true XOR truefalse
  • false XOR falsefalse
  • true XOR falsetrue
  • false XOR truetrue

这种特性非常适合用于“二选一但不能同时为真”的场景。

比如,我们要判断一辆车是柴油车或手动挡,但不能既是柴油又是手动挡(虽然现实中可能存在,但这里仅作示例)。

XOR 的逻辑等价于:

(A && !B) || (!A && B)

括号是为了清晰,实际运算中 && 优先级高于 ||,所以可以省略。

下表展示了所有可能的输入组合及其结果:

XOR Operator Table

3. 在 Java 中如何使用 XOR

Java 提供了原生的 XOR 操作符:^。它属于位运算符(bitwise operator),既可以用于布尔值,也可以用于整数类型。

3.1 使用 &&|| 的冗长写法

假设我们有一个 Car 类:

public class Car {
    private boolean diesel;
    private boolean manual;

    // 构造方法、getter 省略
}

如果我们不用 ^,而是用传统逻辑运算实现 XOR:

Car car = Car.dieselAndManualCar();
boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual());

❌ 这种写法不仅啰嗦,还容易出错,尤其在条件复杂时可读性差。

3.2 使用 ^ 操作符的简洁写法

更简单粗暴的方式是直接使用 ^

Car car = Car.dieselAndManualCar();
boolean dieselXorManual = car.isDiesel() ^ car.isManual();

✅ 一行搞定,语义清晰,不易出错。

⚠️ 注意:^ 是位运算符,但在布尔上下文中,Java 会将其视为逻辑 XOR,行为符合预期。

3.3 XOR 在整数上的应用

XOR 不仅限于布尔值,它对所有基本类型都有效。例如对两个整数进行 XOR 运算:

assertThat(1 ^ 3).isEqualTo(2);

我们来拆解一下:

  • 1 的二进制:00000001
  • 3 的二进制:00000011

按位异或(相同为 0,不同为 1):

  00000001  (1)
^ 00000011  (3)
  --------
  00000010  (2)

✅ 只有第 2 位不同,结果为 1,其余相同为 0,最终得到 2

这个特性在位操作、加密、交换变量等场景中非常有用。比如经典面试题:不用临时变量交换两个数:

int a = 5, b = 3;
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 此时 a = 3, b = 5

原理就是利用了 XOR 的自反性:(a ^ b) ^ b = a

4. 总结

  • ✅ Java 的 ^ 操作符是实现 XOR 的首选方式,简洁高效。
  • ✅ 它既可用于布尔逻辑判断(如“只能选其一”),也可用于位运算。
  • ✅ 在处理标志位、状态机、加密算法时,XOR 是一个强大而常用的工具。
  • ⚠️ 注意不要与 ||(逻辑或)或 |(按位或)混淆。

项目代码已托管至 GitHub:https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-lang-operators
建议集合,日后踩坑时可快速回顾。


原始标题:The XOR Operator in Java