1. 简介
本文我们将学习 异或(XOR)运算,也称为 异或操作。
XOR 在多个领域中都有广泛应用,例如:加密算法、遗传算法、数字信号处理、错误校验机制等。
2. 位运算概述
XOR 是一种 位运算(bitwise operation)。
位运算直接对整数在内存中的二进制位进行操作,通常比普通算术运算更快,因为它们只在单个 CPU 寄存器中完成,不需要多个寄存器之间的数据搬运。
位运算分为两类:
- ✅ 一元运算(Unary):如
~
(按位取反) - ✅ 二元运算(Binary):如
&
(与)、|
(或)、^
(异或)
举个例子:
int a = 5; // 二进制:0101
int b = 3; // 二进制:0011
int and = a & b; // 0001 → 1
int or = a | b; // 0111 → 7
3. 异或运算详解
异或运算用符号 ^
表示,它接受两个操作数,规则如下:
- ✅ 如果两个位相同,结果为
0
- ✅ 如果两个位不同,结果为
1
真值表
x₁ | x₂ | XOR(x₁, x₂) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
3.1 硬件实现
XOR 在硬件层面通常由多个逻辑门组合实现:
- ✅ 2 个与门(AND)
- ✅ 2 个非门(NOT)
- ✅ 1 个或门(OR)
如下图所示:
通过这种组合,可以实现对两个输入位的异或判断。
这种设计正好对应 XOR 的真值表中两个为 1
的情况:
- x₁=1, x₂=0
- x₁=0, x₂=1
4. XOR 在加密中的应用
XOR 在加密算法中非常有用,特别是在 对称加密 中。
4.1 加密流程
XOR 可用于双向加密算法,发送方和接收方共享一个相同的密钥:
- ✅ 发送方使用密钥和明文进行 XOR 得到密文
- ✅ 接收方使用相同密钥和密文进行 XOR 恢复明文
如下图所示:
4.2 示例演示
假设密钥 C = 11001001
,明文 P = 11100101
加密过程如下:
C: 1 1 0 0 1 0 0 1
P: 1 1 1 0 0 1 0 1
----------------------
ENC: 0 0 1 0 1 1 0 0
解密过程如下:
ENC: 0 0 1 0 1 1 0 0
C: 1 1 0 0 1 0 0 1
----------------------
P: 1 1 1 0 0 1 0 1
✅ 可见,两次异或操作后恢复原始明文。
4.3 XOR 在加密中的优势
1️⃣ 不泄露信息
XOR 的结果不能直接反推出输入值,例如:
- ✅ XOR(x1, x2) = 1 → (x1=1, x2=0) 或 (x1=0, x2=1)
- ✅ XOR(x1, x2) = 0 → (x1=1, x2=1) 或 (x1=0, x2=0)
而 AND 和 OR 则会泄露信息:
- AND(x1, x2) = 1 → x1=x2=1
- OR(x1, x2) = 0 → x1=x2=0
2️⃣ 可逆性(Involution)
XOR 是一个 自反函数(involutory function):
XOR(C, XOR(C, P)) = P
这意味着只要使用相同的密钥再做一次异或操作,就能还原原始数据。
5. XOR 的其他用途
除了加密,XOR 还有很多实用场景。
5.1 交换两个变量(不使用临时变量)
传统方式:
int tmp = a;
a = b;
b = tmp;
使用 XOR:
a = a ^ b;
b = b ^ a;
a = a ^ b;
示例:
初始值:a = 6 (0110)
,b = 10 (1010)
a = a ^ b → 1100
b = b ^ a → 0110
(恢复 a 原值)a = a ^ b → 1010
(恢复 b 原值)
最终:a = 10
, b = 6
✅
5.2 校验与容错
XOR 可用于生成 奇偶校验位(Parity Bit),在 RAID 存储系统中实现数据冗余和恢复。
6. 总结
- ✅ XOR 是一种基础但非常强大的位运算
- ✅ 在加密、数据交换、校验等领域有广泛应用
- ✅ XOR 不泄露原始数据信息,具有可逆性
- ✅ 执行效率高,适合底层优化和性能敏感场景
如果你在编写底层代码、加密算法或优化性能时遇到需要位操作的场景,XOR 很可能是一个值得优先考虑的工具。