博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2.1 二进制中1的个数

Posted on 2011-05-14 15:09  各种不会  阅读(302)  评论(0)    收藏  举报

这个问题是求一个数n的二进制中1的个数,《编程之美》这本书上写了有五种解法。

解法一:

其实最容易想到的办法就是这个方法,对于一个数来说除以2有两种情况,当n为偶数的时候,等于是把最右边一位0移除,当n为奇数的时候就会余1,同时将最右边的1移除。所以可以通过循环除2的方法来得到1的个数

1 int Func1(int data)
2 {//对于二进制来说每次除以2,如果是偶数就减少一个0,如果是奇数就会余1,对
3 //data循环除2统计1的次数就可以得到data的二进制中又多少个1
4   int count = 0;
5 while (data != 0)
6 {
7 if (data%2 == 1)
8 {
9 count++;
10 }
11 data /= 2;
12 }
13 return count;
14 }

解法二

其实思路和解法一是一样的只是用移位来实现,这种方法看起来更直观,直接上代码:

1 int Func2(int data)
2 {
3 int count = 0;
4 while (data)
5 {
6 count += data & 0x1;
7 data >>= 1;
8 }
9 return count;
10 }

解法三:

非常巧妙地利用了一个性质,n=n&(n-1) 能移除掉n的二进制中最右边的1的性质,循环移除,直到将1全部移除,这种方法将问题的复杂度降低到只和1的个数有关系。代码如下:

1 int Func3(int data)
2 {//利用了data&(data-1)每次都能移除最右边的1,移除了多少个1,就是包含了几个1
3   int count = 0;
4 while (data)
5 {
6 data = data & (data-1);
7 count++;
8 }
9 return count;
10 }

书上的解法四和解法五都是枚举的思想,就不在多写了。

扩展问题二:

A和B的二进制中有多少位不相同。这个问题可以分为两步,(1)将A和B异或得到C,即C=A^B,(2)计算C的二进制中有多少个1