/*(1)对整个数组进行异或,结果为只出现一次的两个数字异或的结果
(2)找到一个为1的异或结果的下标,根据该下标将数组分成两个部分
(3)分别对这两个部分进行异或,则结果是这两个数字
*/
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
/*(1)对整个数组进行异或,结果为只出现一次的两个数字异或的结果
(2)找到一个为1的异或结果的下标,根据该下标将数组分成两个部分
(3)分别对这两个部分进行异或,则结果是这两个数字
*/
if(data.size()<2)return ;
//异或整个数组
int DataOr=data[0];
for(int i=1;i<data.size();i++)
DataOr^=data[i];
//找到一个出现1的下标
int index=0;
while((DataOr&1)==0)
{
DataOr=DataOr>>1;
index++;
}
//对第index位进行异或
*num1=*num2=0;
for(int i=0;i<data.size();i++)
{
if(Bit(data[i],index))
{
*num1^=data[i];
}
else
*num2^=data[i];
}
}
bool Bit(int num,int index)
{
num=num>>index;
return (num&1);
}
};