1. 概述
本文将深入讲解 Java 中的 XOR(异或)操作符。我们会先回顾 XOR 的基本逻辑原理,然后结合实际代码演示它在 Java 中的使用方式。内容简洁实用,适合有一定经验的开发者快速掌握核心要点,避免踩坑。
2. XOR 操作符的逻辑原理
XOR,全称 exclusive OR(异或),是一种逻辑运算,接收两个布尔值作为操作数,当且仅当两个操作数不同时返回 true,否则返回 false。
✅ 简单来说:
true XOR true
→false
false XOR false
→false
true XOR false
→true
false XOR true
→true
这种特性非常适合用于“二选一但不能同时为真”的场景。
比如,我们要判断一辆车是柴油车或手动挡,但不能既是柴油又是手动挡(虽然现实中可能存在,但这里仅作示例)。
XOR 的逻辑等价于:
(A && !B) || (!A && B)
括号是为了清晰,实际运算中 &&
优先级高于 ||
,所以可以省略。
下表展示了所有可能的输入组合及其结果:
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
建议集合,日后踩坑时可快速回顾。