首页 > 代码库 > 计算一个二进制数中1的个数

计算一个二进制数中1的个数

如果我们要计算一个二进制数中1的个数,很显然会想到运用位运算的知识来解决。

前面有篇博文,讲如何判断一个数是否是2的幂,其实就是判断一个二进制数中是否仅含有一个1,解法是x & x - 1

在理解上式的前提下,我们可以发现,如果二进制数x中包含不止一个1,那么x&x-1的结果就使得原先的x失去的最末尾了一个1。

因此,我们可以利用x&x-1循环得到x中1的个数。

代码如下:

 1 int 2 CountOnes(int num) 3 { 4     int count; 5     for (count = 0; num != 0; count++) { 6         num &= num - 1; 7     } 8      9     return count;10 }

 

或许还有一种思路:如果一个数x的最后一位含有1,则该数是奇数,因此我们可以一步一步将x右移,判断x是否为奇数,如果是,则当前的最末位是1。直到x为零为止。考虑到x是负数的话,可能会导致算术右移(右移的时候,最高位补1),导致1的个数是无穷多。我们将函数的参数设为无符号整数unsigned int。

代码如下:

 1 int 2 CountOnes(unsigned int num) 3 { 4     int count; 5     for (count = 0; num != 0; num >>= 1) { 6         if (num % 2 == 1) { 7             count++; 8         } 9     }10     return count;11 }

 

另外,二进制数中1的个数在计算机科学上称之为Hamming weight,已经有许多实现它的高效的方法,并且许多的处理器在机器指令的层面支持对它的计算,GCC也从编译器的层面提供了内置的函数对其进行运算(我还没有测试)。详见Hamming weight。

计算一个二进制数中1的个数