给一个很大的数组,里面有两个数只出现过一次,其他数都出现过两次,把这两个数找出来
void getNum(int a[],int length){ int s = 0;//保存异或结果 for(int i=0;i>1; k++; } for(int i=0;i >k)&1) //将s与数组中第k位为1的数进行异或,求得其中一个数 { s=s^a[i]; } } cout< <<" "<<(s^temp2)<
假设二个不同数值是a,b;那么 s = a^b; 然后求的s中第一次出现1的位置k,根据异或运算特性,第一次出现1的地方就是这二个数位有区别的地方,比如1001 0101 与 1100 0001 得到异或结果是0101 0100 .那么第一次出现1的地方是第三位,a的第三位是1而b是0 。 接着遍历数值,找出第三位是1的数值就异或,得到的结果就是其中一个数与其他出现二次的数求异或,因为出现二次的数异或得到为0所有最后结果就是所求其中一个数。 最后s与该数求异或就得到另一个数。