概念
异或(XOR)运算是计算机中常用的位运算之一,符号为 ^
,其定义如下:
- 相同为0,不同为1:对于两个二进制位,如果相同则结果为0,如果不同则结果为1。
性质
- 交换律:
A ^ B = B ^ A
异或运算满足交换律,即交换两个操作数的位置不会改变结果。 - 结合律:
(A ^ B) ^ C = A ^ (B ^ C)
异或运算满足结合律,即不管如何分组,结果是相同的。 - 自反性:
A ^ A = 0
对同一个数进行异或操作,结果为0。 - 零律:
A ^ 0 = A
任何数与0异或,结果仍为该数。 - 对称律:
A ^ B = B ^ A
和交换律相同。 - 相等律:
A ^ A = 0
对同一个数进行异或操作,结果为0。
应用
-
交换两个变量的值:通过异或运算可以在不使用临时变量的情况下交换两个数的值。
-
检验两个数是否相等:如果两个数的异或结果为0,则说明它们相等。
-
构建校验和:比如CRC校验、哈希计算中常用异或。
-
加密算法:异或在一些简单的加密算法(如流密码)中也有广泛应用。
示例
交换两个变量的值
#include <iostream>
using namespace std;int main() {int a = 5, b = 10;// 打印交换前的值cout << "Before swap: a = " << a << ", b = " << b << endl;// 使用异或交换 a 和 ba = a ^ b; // a变成 a ^ bb = a ^ b; // b变成 (a ^ b) ^ b = aa = a ^ b; // a变成 (a ^ b) ^ a = b// 打印交换后的值cout << "After swap: a = " << a << ", b = " << b << endl;return 0;
}
检验两个数是否相等
#include <iostream>
using namespace std;int main() {int x = 15, y = 15;if ((x ^ y) == 0) {cout << "x and y are equal." << endl;} else {cout << "x and y are not equal." << endl;}return 0;
}
统计一个数二进制中1的个数(Hamming Weight)
#include <iostream>
using namespace std;int countSetBits(int n) {int count = 0;while (n) {count += (n & 1); // 检查最低位是否为1n >>= 1; // 右移一位}return count;
}int main() {int n = 29; // 二进制表示为 11101cout << "The number of 1s in " << n << " is: " << countSetBits(n) << endl;return 0;
}
使用异或运算构建一个简单的加密解密
#include <iostream>
using namespace std;char xorEncryptDecrypt(char ch, char key) {return ch ^ key; // 异或加密/解密
}int main() {char key = 'K'; // 加密密钥char message = 'H'; // 明文char encrypted = xorEncryptDecrypt(message, key);cout << "Encrypted: " << encrypted << endl;// 解密char decrypted = xorEncryptDecrypt(encrypted, key);cout << "Decrypted: " << decrypted << endl;return 0;
}