// 数组中所有数都是成对出现,
// 只有一个数只出现一次,找出这个数
//所有数进行异或,相同的数异或为0,0与其他数异或为该数本身
int main()
{
int a[] = {2, 2, 4, 4, 6, 6, 5};
int len = sizeof(a) / sizeof(int);
int num = 0;
int i;
for (i = 0; i < len; i++)
{
num = num ^ a[i];
}
printf("num = %d\n", num);
return 0;
}
// 数组中所有数都是成对出现,
// 只有两个数只出现一次,找出这两个数
//由所有数的异或结果按位分析,为1的位,两个数在此位上不同,借此将数组分为两组,然后对两组数据分别进行上面的操作,即可分别找出单个的数
int main()
{
int a[] = {2, 2, 4, 4, 6, 6, 1, 3};
int len = sizeof(a) / sizeof(int);
int num = 0;
int num1 = 0;
int num2 = 0;
// 1、两个数的异或结果
int i;
for (i = 0; i < len; i++)
{
num = num ^ a[i];
}
// 2、从右往左找第一个不为 0 的位
int count =0;
while(1)
{
if (num & 1 == 1)
{
break;
}
num = num >> 1;
count++;
}
// 3、分组异或
for (i = 0; i < len; i++)
{
int tmp = a[i] >> count;
if (tmp & 1)
num1 ^= a[i];
else
num2 ^= a[i];
}
printf("num1 = %d\n", num1);
printf("num2 = %d\n", num2);
return 0;
}