源代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int a[] = {1,2,3,4,6,3,2,1};
int n = 0, i, size, count = 0, bit = 0;
int result1, result2;
size = sizeof(a) / sizeof(a[0]);
/*这一块用于获得异或的结果n*/
for (i = 0; i < size; i++)
{
n = n ^ a[i];
}
printf("n = %d\n", n);
/*下面的这一块用于获得,比如在这题,4和6异或的结果为2,那么其中就会4&2就是0,而6&2就不是0,那么就可以成功把4和6区分开。当然对于5和10,异或结果是00001111,但只要我们取出其中一个比特就好,比如1,5&1不是0,而10&1是0.也可以成功区分开。所以下面的代码就是取出第一个1*/
while ((n & (1 << count)) == 0)
{
count++;
}
printf("%d", (1 << count));
/*成功获得00000010以后,就可以获得结果了*/
result1 = result2 = 0;
for (i = 0; i < size; i++)
{
if ((a[i] & (1 << count)) == 0)
{
result1 = result1 ^ a[i];
}
else
{
result2 = result2 ^ a[i];
}
}
printf("the result is %d and %d.\n", result1, result2);
return 0;
}
注意点 if (5&3 == 0,5&3一定要加(),也就是改成if ((5&3) == 0)。