码迷,mamicode.com
首页 > 其他好文 > 详细

位运算

时间:2015-08-26 17:09:14      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

题目如下:一个全是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 ones;
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。

位运算

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!