#include<stdio.h>#include<stdlib.h>intfind_one_bit(intnum)//约定寻找二进制中的某一位为1的位{intbit=0;while(num){if(num&1==1)returnbit;bit++;num=num>>1;}return-1;}voidfind_num(intarr[],intsize,int*p1,int*p2){inttmp=0;inti=0;intpos=0;for(i=0;i<size;i++){tmp^=arr[i];//tmp保存的最终结果为不同的两个数字异或的结果}pos=find_one_bit(tmp);for(i=0;i<size;i++){if(1&(arr[i]>>pos))//约定二进制位中同一位置是否为1,用以分组数字,因为某一位为1时,由异或的结果可知必定一个数字该位为0,另一个为1。0(0==*p1)与任何数字异或仍为该数本身。*p1^=arr[i];else*p2^=arr[i];}}//主函数intmain(){intarr[]={1,2,3,4,5,1,2,6,3,4};intsize=sizeof(arr)/sizeof(arr[0]);intnum1=0;intnum2=0;find_num(arr,size,&num1,&num2);//num1,num2必须传进地址,否则只是修改了形参而并不影响主函数的值,num1,num2仍为初始化的0。printf("%d%d\n",num1,num2);system("pause");return0;}