/* 有两个数A B分别出现一次 其余出现两次
* 只要能找到一个划分一个包含A 一个包含B 对两个分别使用找出出现一次的算法
*
* */
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int axorb=0;
for(int &num:nums) axorb ^= num;
// x&(-x) 得到的是一个mask返回最低位1所在的位置 allxor最后是两个不同的数异或的结果
// eg: allxor=10 即1010 mask=10 根据异或性质 A B 在第1位的值不同
int a=0, b=0, mask=axorb&(-axorb);
//cout<<mask<<endl<<" "<<axorb;
//cout<<bitset<32>(-6)<<endl;
for(int &num:nums){
if(mask&num) a ^= num;
else b ^= num;
}
return {a,b};
}
};
x & (-x) 用以提取倒数第一个非零位
cout<<bitset<32>(6)<<endl; //00000000000000000000000000000110
cout<<bitset<32>(-6)<<endl; //11111111111111111111111111111010