数组中所有数都是成对出现,只有两个数只出现一次,找出这两个数
int main()
{
int a[] = {2,4,6,5,4,2,6,3};
int len = sizeof(a)/sizeof(int);
int num = 0;
int num1 = 0;
int num2 = 0;
// 1、两个数的异或结果
int i = 0;
for (i = 0; i < len; i++)
num ^= a[i];
// 2、从右往左找第一个不为 0 的位
int count = 1;
while(1)
{
if(num & 1 == 1)
break;
num >>= 1;
count++;
}
// 3、分组异或
for(i = 0; i < len; i++)
{
int temp = a[i] >> (count-1);
if(temp & 1) // a[i]的第 count 位为 1
num1 ^= a[i];
else
num2 ^= a[i];
}
printf("num1 = %d\n", num1);
printf("num2 = %d\n", num2);
return 0;
}