在实现单身狗2时,先联想到单身狗1 的实现过程
#include <stdio.h>
int* find_dog(int arr[], int sz,int* ret1,int* ret2) //单身狗2函数
{
int i = 0;
int j = 0;
int n = 0;
for (i = 0; i < sz; i++) //先用异或把全部的数异或到一起
{
n ^= arr[i];
}
for (i = 0; i < 32; i++) //在全部异或的数上,寻找一个比特位上为1所处的位置为右移第几位,
{
if (((n >> i) & 1) == 1)
{
j = i;
break;
}
}
for (i = 0; i < sz; i++) //判断:数组中位置为第j位全部为1的数,异或到一起,就可以找到
//两个出现一次中一个数;
{
if (((arr[i] >> j) & 1) == 1)
{
*ret1 ^= arr[i];
}
else //判断:数组中位置为第j位全部为1的数,异或到一起,就可以找到
//两个出现一次中另一个数;
{
*ret2 ^= arr[i];
}
}
}
int main()
{
int arr[10] = {1,2,3,5,1,2,3,7};
int sz = sizeof(arr) / sizeof(arr[0]);
int ret1 = 0;
int ret2 = 0;
find_dog(arr,sz,&ret1,&ret2);
printf("%d %d ", ret1, ret2);
return 0;
}