首页 > 代码库 > 计算一个二进制数中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的个数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。