//1.一个数组中只有两个数字是出现一次,
//其他所有数字都出现了两次。
//找出这两个数字,编程实现
#include<stdio.h>
#include<stdlib.h>
#define SIZE(arr) sizeof(arr) / sizeof(arr[0])
int main(){
int arr[] = { 1, 2, 3, 1, 2, 4 };
int i, sum = 0;
int pos;
int num1 = 0 , num2 = 0;
for (i = 0; i < SIZE(arr); ++i){ //两个相同的数异或后为0,sum的值为两个单独的数的和。
sum ^= arr[i];
}
for (i = 0; i < 32; i++){
if (sum & 1 << i){ //找到sum二进制时第一个为 1 的位置。
pos = i;
break;
}
}
for (i = 0; i < SIZE(arr); ++i){
if (arr[i] & 1 << pos){ //为将第一个为 1 ,的位置作为基准,将数组分为在哪个位置
//为 1 和不为 1 的两组。
num1 ^= arr[i]; //在那个位置为 1 的一组
}
else{
num2 ^= arr[i]; //在那个位置为 0 的一组
}
}
printf("%d %d\n", num1, num2);
system("pause");
return 0;
}