位运算

题目如下:一个全是32位整数的大数组,除了其中一个数字出现2次外,其余的数字都出现了3次。如何找出那个只出现了两次的数字?

 1 int singleNumber3(int a[], int length){
 2     int ones = 0;
 3     int twos = 0;
 4     int not_three = 0;
 5     for(int i=0;i<length;i++){
 6         twos |= ones&a[i];
 7         ones^=a[i];
 8         not_three = ~(ones&twos);
 9         ones = ones&not_three;
10         twos = twos&not_three;
11     }
12     return twos;
13 }

ones最后的结果是代表出现(mod3=1)次的数,twos代表出现(mod3=2)此的数。

解析:

twos |= ones&a[i];ones出现一次,那么ones&a[i]中的bit位为1表示当前出现两次,与历史信息相或,那么twos中出现的bit位为1就表示已出现两次。

not_three = ~(ones&twos),ones&twos中bit位为1的表示出现三次,ones代表出现一次,two代表已出现两次,相与就表示出现三次。

ones &=not_three将出现三次的清零。

同理twos&=not_three。

原文地址:https://www.cnblogs.com/zhang-wen/p/4760738.html