1.12.2编程实现: 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。(使用位运算)


#include
#include
void find(int arr[], int len) {
    int a = 0;
    int i = 0;
    int b = 0;
    int s1 = 0;
    int s2 = 0;
    for (i = 0; i < len; i++) {
        a = a ^ (arr[i]);  //a为数组遍历异或后,s1和s2的异或值
    }
    for (i = 1; i <= 32; i++) {
        if (1 &(a >> i) == 1) {  //求二进制数a最左边为1的时,右移的位数i的值
            b = i;
        }
    }
    for (i = 0; i < len; i++) {
        if ((arr[i] >> b) & 1 == 1) {  //遍历出所有数组中第i位为1的数
            s1 ^= arr[i];//
        }
        else { //遍历出所有数组中第i位为0的数
            s2 ^= arr[i];
        }
    }
    printf("s1=%d\n s2=%d\n", s1, s2);
}
int main3() {
    int arr[] = { 1,2,3,4,5,6,4,3,2,1 };
    int len = sizeof(arr) / sizeof(arr[0]);
    find(arr, len);
    system("pause");
    return 0;
}

你可能感兴趣的:(1.12.2编程实现: 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。(使用位运算))