C语言 bitcount 统计整形参数的二进制表达式的值为1的个数

重温C语言时,记录一些学习时的收获吧

这个例子中,需要统计函数的整形参数表达成二进制形式后,其中值为1的位的个数。
首先想到的是用位运算符,将参数不断进行右移,每次与1进行&运算就能判断最右边一位是否为1。
函数的代码很简单:

int bitcount(unsigned x){
   int n;
   for(n=0; x!=0; x>>=1)
      if(x&01)
        n++;
    return n;
}

其中一个细节是将x声明为unsigned类型,可以保证在x右移过程中,无论在什么机器运行,左边补上的位都将是0 .

下面对程序进行一些改进:
实际上我们可以用 x&(x-1)来消除x中最右边一位为1的值

int bitcount(unsigned x){
   int n;
   for(n=0; x!=0; x&(x-1))
        n++;
    return n;
}

我们以一个八位二进制数来举例: 10010010
第一步 10010010&10010001=10010000
第二步 10010000&10000001=10000000
第三步 10000000&01111111=00000000
此时n=3 而该八位二进制数也恰好回到0
假如以上一个方法对该8位二进制数进行统计,需要移位8次,进行八次比较
而用x&(x-1) 只需要三步
只有在极端情况下,即八位全为1,则需进行八次&操作,与八次移位次数一样多。
所以总的来说 新的方案的运行速度会稍快一些。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值