异或方式找到一组数组中不重复的两个数(同班同学方法)

源代码如下:

#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);

 

/*下面的这一块用于获得,比如在这题,46异或的结果为2,那么其中就会4&2就是0,而6&2就不是0,那么就可以成功把46区分开。当然对于510,异或结果是00001111,但只要我们取出其中一个比特就好,比如1,5&1不是0,而10&10.也可以成功区分开。所以下面的代码就是取出第一个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 == 05&3一定要加(),也就是改成if ((5&3) == 0)

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_38313246/article/details/79181135