这个问题是求一个数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
浙公网安备 33010602011771号