如何使用异或找到数组中的两个“单身狗”
int main()
{
int x1 = 0; //单身狗1号
int x2 = 0; //单身狗2号
int m = 0; //寻找两个单身狗异或后第m位为1
int ret = 0; //存储两个单身狗异或后的值
int arr[] = {1,1,2,2,3,3,4,4,5,6,6,7};
int sz = sizeof(arr)/sizeof(arr[0]);
int i = 0;
for(i = 0; i<sz; i++)
{
ret = arr[i]^ret; //ret为数组中的数异或的结果就是单独的5^7
}
//printf("%d ", ret); 打印只有一个单身狗时
//从数组分离5^7
//找到ret = 5^7二进制中第m为1
//就是5和7二进制中第m位一个为1一个为0
//然后从数组中将他们分为两组
//一组中第m位为1,另外一组m位为0
//最后成对的都被抵消,剩下的就是单身狗
while(m<32)
{
if(ret&(1<<m))
{
break;
}
else
{
m++;
}
}
for(i = 0; i<sz; i++) //找到二进制位第一个一
{
if(arr[i]&(1<<m))
{
x1 = x1 ^ arr[i]; //第m位为1的异或在一起
}
else
{
x2 = x2 ^ arr[i]; //m为不是1的异或在一起
}
}
printf("%d, %d", x1, x2);
return 0;
}