版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nwpubear/article/details/81748748
主要考察异或运算
1. 全部异或得到结果的二进制是1的那一个位置
2. 两个数字必然在那一位也是为1,为0
3. 全部的数字的二进制同样位置上为1的进行异或,得到一个结果
4. 全部的数字的二进制同样位置上为0的进行异或,得到另一个
class Solution {
//先全体异或,找到这个结果是1的位置index,index从右边往左边(低位到高位,从0开始)
//原数组中该位置为1的一组异或结果为num1;
//原数组中该位置不是1的一组异或结果为num2;
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
unsigned int _xor=0;
for(int i=0;i<data.size();i++)
_xor^=data[i];
unsigned int index=findIndexOfBit1(_xor);
*num1=0;*num2=0;
for(int i=0;i<data.size();i++){
if(isBit1(data[i],index))
*num1^=data[i];
else
*num2^=data[i];
}
}
static unsigned int findIndexOfBit1(unsigned int n){
int index=0;
while((n&1)==0 && index<8*sizeof(int)){
index++;
n>>=1;
}
return index; //注意index是从0开始记
}
static bool isBit1(int n,int index){
n>>=index;
return (n&1);
}
};