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;
}
输出的最后一个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)
因为异或运算服从交换律和结合律,所以我们先算(1)异或(7) = 0,而0对异或的结果没有影响。同理,(2)异或(3)=0,(5)异或(6) = 0,那剩下的就是 0异或(4),结果自然是(4),也就是那个唯一的只出现一次的数字3:)