整数二进制展开中数位1的总数

这篇博客介绍了邓俊辉老师书中的两种算法,用于计算整数二进制展开中1的个数。第一种算法通过移位操作消除最低位的1,复杂度为O(1的个数)。第二种算法利用特定的MASK数进行计算,复杂度为O(log log n),展示了对二进制位操作的巧妙运用。
摘要由CSDN通过智能技术生成

整数二进制展开中数位1的总数


前言

目前在,额,怎么说呢,回炉重造数据结构,今天在邓俊辉老师的书上看到了一个很有意思的算法,第一遍没看明白,后面仔细想了一下才搞明白什么意思,觉得很有趣,记录一下。
这个算法如题所言,统计整数二进制展开中数位1的总数
,网上常见的算法是通过将数n二进制展开中的最低位1转置0来统计,此算法本文也会介绍(说是介绍其实是抄书啦),然邓老师书上又介绍了一个更有趣的算法,这个会介绍本人的见解。


设输入一个数n,位宽W=log n.

1.第一种算法

先上代码

0001 int countOnes1 ( unsigned int n ) { //统计整数二进制展开中数位1的总数:O(ones)正比于数位1的总数
0002    int ones = 0; //计数器复位
0003    while ( 0 < n ) { //在n缩减至0之前,反复地
0004       ones++; //计数(至少有一位为1)
0005       n &= n - 1; //清除当前最靠右的1
0006    }
0007    return ones; //返回计数
0008</
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值