C++ : ^=(异或的一个妙用)
妙用在于: 对于一个元素为整数的数列,其中只有一个数只出现过一次,其他的数都是出现两次,要求找到并输出那唯一一个数.
代码如下:
#include<iostream> #include<vector> using namespace std; int main() {int res = 0;vector<int> a{ 1,2,2,3,4,4,1 };for (int i = 0; i < a.size() ; i++){res ^= a[i];cout << res << ",";}return 0; }
1234567891011121314151617输出的最后一个res就是所求的答案,也就是数字3.!!
关键在于异或运算的特殊性。对于一个整数而言,它与自身的异或为0,而0与任何数字的异或结果为任何数字。
对于本题而言,{1,2,2,3,4,4,1},res的最终结果就可以看成是下面一系列异或运算的叠加。
0 0 0 0 ^0 0 0 1 -----------(1) ^0 0 1 0 -----------(2) ^0 0 1 0 -----------(3) ^0 0 1 1 -----------(4) ^0 1 0 0 -----------(5) ^0 1 0 0 -----------(6) ^0 0 0 1 -----------(7) 123456789
因为异或运算服从交换律和结合律,所以我们先算(1)异或(7) = 0,而0对异或的结果没有影响。同理,(2)异或(3)=0,(5)异或(6) = 0,那剩下的就是 0异或(4),结果自然是(4),也就是那个唯一的只出现一次的数字3:)