void Find(int a[],int len,int*p,int *q)
{
int i = 0;
int ret = 0;
for (i = 0; i <len ; i++)
{
ret = ret^a[i];//相当于ret = 0^a[0]^...^a[len - 1],最后等于不同的两个数异或
}
int j = 0;
for (j = 0; j < 32; j++) //这里的j是有意义的——找到这两个数二进制补码中不同的位置.
{
if ((ret >> j)&1 == 1 )
{
break;
}
}
for (i = 0; i < len; i++) //上面的i出来之后等于len,但没什么意义,只是一个数组的下标,所以可以一直用i来循环。
{
if ((a[i] >> j) & 1 == 1) //使用if就能把这两个数分开,并且那些出现两次的数对应的每一个位都是一样的,他们成对出现在下面的*p与*q。
{
*p = *p ^ a[i];
}
else
{
*q = *q ^ a[i];
}
}
}
int main()
{
int a[] = { 1, 2, 3, 3, 2, 1, 4, 5 };
int len = sizeof(a) / sizeof(a[0]);
int i = 0;
int j = 0;
Find(a, len,&i,&j);//因为想要返回两个数,所以传地址
printf("%d %d", i, j);
return 0;
}