题目:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。
解析:异或的特点是两个相同的数异或等于没有异或(例如:4和4异或等于0),利用这个特点,先将数组中的数字一一异或一遍得出来的结果就是这两个不相同的数字异或的结果(这个结果一定不是0),找这个结果任意为1的一位(因为不相同的位异或才为1),根据这一位,将这个数组分为两个组,然后分别对他们进行异或,两组各自异或的最后结果就是这两个不一样的数。
void findTwoNum(int arr[], int n, int * pnum1, int * pnum2)
{
int i;
int sum = 0;
for (i = 0; i < 9; i++)
{
sum ^= arr[i];
} //先找到两个数互相异或的结果
int pos;
for (i = 0; i < 32; i++)
{
if (sum & 1 << i) //<<操作符的优先级比&要高
{
pos = i;
break;
}
} //再找到有分歧的一位。在这一位上,两个数一定是一个1一个0
*pnum1 = *pnum2 = 0;
for (i = 0; i < 10; i++)
{
if (arr[i] & 1 << pos)
{
*pnum1 ^= arr[i]; //这一位是1的,放在数1里
}
else
{
*pnum2 ^= arr[i]; //这一位是0的,放在数2里
}
}
}