思路
异或:相同数之间的异或,结果为0;不同数之间的异或,为这两个数的和。
1)将整个数组进行异或,异或的结果就是两个不一样的数字异或的结果
2)求出异或的结果当中,从右往左数第pos位为1的下表pos
3)将数组以第pos位为1或者不为1分为两个数组
4)分别对两个数组进行异或,可得出这两个数字
图片说明:
void Func(int *arr, int len, int *px, int *py)
{
int ret = 0;
int pos = 0;
for (int i = 0; i < len; i++)
{
ret ^= arr[i];
}//整体异或的结果,存放到num中
for (int j = 0; j < 32; j++) //找到ret从右往左数第pos位为1
{
if (((ret >> j) & 1) == 1)
{
pos = j;
break; //找到第一位为1的位置,直接跳出
}
}
for (int i = 0; i < len; i++)
{
if (((arr[i] >> pos) & 1) == 1)
{
*px = *px^arr[i];
}
else
{
*py = *py^arr[i];
}
}
}
int main()
{
int arr[] = {3,1,9,2,5,8,6,1,5,9,6,8 };
int len = sizeof(arr) / sizeof(arr[0]);
int x = 0;
int y = 0;
Func(arr, len, &x, &y);
printf("%d %d", x, y);
system("pause");
return 0;
}