神奇!

上礼拜六运动会居然看见大学同学--田老大,居然在同一公司,感觉太神奇!
是的!`a ^ b ^ a = b` 确实非常神奇,但它背后的原理清晰且强大。这个性质是**异或(XOR)运算的核心特性之一**,在算法、加密、去重等问题中有着广泛应用。 --- ## ✅ 为什么 `a ^ b ^ a = b` 成立? 我们来一步步推导: ### 🧩 异或的三大基本性质 1. **交换律**:`a ^ b = b ^ a` 2. **结合律**:`(a ^ b) ^ c = a ^ (b ^ c)` 3. **自反性**:`a ^ a = 0` 4. **与0的性质**:`a ^ 0 = a` 利用这些性质: ```text a ^ b ^ a = a ^ a ^ b ← 交换律 = (a ^ a) ^ b ← 结合律 = 0 ^ b ← 因为 a ^ a = 0 = b ← 因为 0 ^ b = b ``` ✅ 所以: > $$ a \oplus b \oplus a = b $$ 这就是所谓的“**抵消律**”或“**异或自反性**”。 --- ## 💡 实际应用示例 ### 1. 不使用临时变量交换两个数 ```cpp int a = 5, b = 9; cout << "交换前: a=" << a << ", b=" << b << endl; a = a ^ b; // a 存储了 a^b b = a ^ b; // b = (a^b)^b = a a = a ^ b; // a = (a^b)^a = b cout << "交换后: a=" << a << ", b=" << b << endl; ``` 输出: ``` 交换前: a=5, b=9 交换后: a=9, b=5 ``` ✅ 原理就是利用了 `x ^ x = 0` 和 `x ^ 0 = x` > ⚠️ 注意:这种方法虽然巧妙,但在现代编译器优化下并不比 `std::swap` 更快,还可能出错(比如 `a` 和 `b` 是同一个变量时需小心) --- ### 2. 找出数组中唯一出现一次的数字(其他都出现两次) 题目:给定数组 `[4, 1, 2, 1, 2]`,只有 `4` 出现一次,其余都出现两次,找出 `4` 解法:全部异或起来! ```cpp int findSingle(vector<int>& nums) { int result = 0; for (int x : nums) result ^= x; return result; } ``` 解释: - 每个成对的数字 `x ^ x = 0` - 最终只剩下那个唯一的数:`0 ^ unique = unique` 例如: ```text 4 ^ 1 ^ 2 ^ 1 ^ 2 = 4 ^ (1^1) ^ (2^2) = 4 ^ 0 ^ 0 = 4 ``` ✅ 完美解决! --- ### 3. 加密与解密(简单流密码) 异或的可逆性被广泛用于加密: ```cpp char data = 'A'; // 原始数据 char key = 'X'; // 密钥 // 加密 char encrypted = data ^ key; // 解密 char decrypted = encrypted ^ key; // 又变回 'A' cout << "原始: " << data << endl; cout << "加密后: " << (int)encrypted << endl; cout << "解密后: " << decrypted << endl; ``` ✅ 因为 `(data ^ key) ^ key = data` 这正是许多一次性密码本(One-time pad)的基础。 --- ### 4. 恢复缺失的信息 假设你有两个值 `a` 和 `b`,但只保存了它们的异或值 `xor_val = a ^ b`,如果你后来知道了 `a`,就可以恢复 `b`: ```cpp int xor_val = a ^ b; int recovered_b = xor_val ^ a; // = b ``` 这种思想用在 RAID 磁盘阵列的数据冗余中。 --- ## 🔁 图解说明:为什么能“抵消” ``` a: 1 0 1 1 ← 二进制 b: 0 1 1 0 a^b: 1 1 0 1 ← 中间结果 再 ^a: 1 1 0 1 ^ 1 0 1 1 -------- 0 1 1 0 ← 又回到了 b! ``` 每一位独立运算,相同变 0,不同变 1 —— 所以两次异或同一个数就“撤销”了效果。 --- ## ⚠️ 注意事项 - 这个性质只对**整数类型**有效(支持位运算) - 如果 `a` 或 `b` 是浮点数?❌ 不行!C++ 中不能对 float 直接用 `^` - 如果 `a` 和 `b` 是指针?通常也不建议这样做 - 在并发编程中要小心顺序问题(虽然异或本身是结合的) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值