计算一个二进制数中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

转载于:https://www.cnblogs.com/nipan/p/4069420.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值