异或操作(XOR,全称 Exclusive OR)是一种二进制位运算,通常用符号 ^ 表示。它的运算规则如下:
- 如果两个二进制位相同,结果为
0。 - 如果两个二进制位不同,结果为
1。
异或操作的性质
- 交换律:
a ^ b = b ^ a - 结合律:
(a ^ b) ^ c = a ^ (b ^ c) - 自反性:
a ^ a = 0 - 与零的异或:
a ^ 0 = a
异或操作的主要优点是:
- 运算速度快(CPU级别的操作)
- 可逆性(A^B^B = A)
- 无需额外存储空间
- 适合位级操作
示例
假设我们有两个二进制数 a = 1010 和 b = 1100,它们的异或操作如下:
1010 (a)
^ 1100 (b)
------
0110 (结果)
在编程中的应用
查找唯一元素
在数组中,所有元素都出现两次,只有一个元素出现一次,可以通过异或操作找到这个唯一的元素。
def find_unique_element(arr):
result = 0
for num in arr:
result ^= num
return result
交换两个变量的值
通过异或操作,可以在不使用额外变量的情况下交换两个变量的值。
def swap_variables(a, b):
a = a ^ b
b = a ^ b
a = a ^ b
return a, b
检测奇偶性
通过异或操作可以快速检测一个数的奇偶性。如果一个数的最低位是 1,那么它是奇数;如果是 0,那么它是偶数。
def is_odd(num):
return num & 1 == 1
翻转特定位
通过异或操作可以翻转一个数的特定位。例如,翻转第 i 位:
def flip_bit(num, i):
mask = 1 << i
return num ^ mask
加密和解密
异或操作可以用于简单的加密和解密。将明文与密钥进行异或操作可以得到密文,再次异或可以得到明文。
# 简单的异或加密
def xor_encrypt(data, key):
return bytes(a ^ b for a, b in zip(data, key))
# 加密和解密是同一个操作
message = b"Hello"
key = b"12345"
encrypted = xor_encrypt(message, key)
decrypted = xor_encrypt(encrypted, key) # 得到原始消息
判断两个数是否相等
def is_equal(a, b):
return (a ^ b) == 0
计算相邻数字的差异位数
def count_different_bits(a, b):
return bin(a ^ b).count('1')
图形处理
- 图像的加解密
- 图像水印
- 图像掩码
- 图像翻转
- 图案生成