首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计数二进制表示的1的个数

计数二进制表示的1的个数
EN

Stack Overflow用户
提问于 2012-01-16 00:18:45
回答 21查看 176.1K关注 0票数 83

如果你有足够的内存来计算O(1)中一个数的二进制表示中的1的个数,这是一个有效的方法。这是我在一个在线论坛上找到的一个面试问题,但它没有答案。有人能提个建议吗?我想不出能在O(1)时间内完成的方法。

EN

回答 21

Stack Overflow用户

回答已采纳

发布于 2012-01-16 00:28:22

这就是Hamming weight的问题。人口计数。该链接提到了有效的实现。引用:

有无限的内存,我们可以简单地创建一个包含每个64位整数

的汉明权重的大型查找表

票数 61
EN

Stack Overflow用户

发布于 2012-01-16 00:48:11

我有一个计算O(Number of 1's)时间的解决方案:

代码语言:javascript
运行
复制
bitcount(n):
    count = 0
    while n > 0:
        count = count + 1
        n = n & (n-1)
    return count

在最坏的情况下(当数字是2^n - 1,所有的1都是二进制),它将检查每一位。

编辑:刚刚发现了一个非常好的恒定时间,恒定内存的位数算法。下面是用C编写的代码:

代码语言:javascript
运行
复制
int BitCount(unsigned int u)
{
     unsigned int uCount;

     uCount = u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111);
     return ((uCount + (uCount >> 3)) & 030707070707) % 63;
}

你可以在here上找到它的正确性证明。

票数 55
EN

Stack Overflow用户

发布于 2013-08-18 05:47:23

请注意: n&(n- 1 )总是消除最低有效的1。

因此,我们可以编写如下代码来计算1的数量:

代码语言:javascript
运行
复制
count=0;
while(n!=0){
  n = n&(n-1);
  count++;
}
cout<<"Number of 1's in n is: "<<count;

程序的复杂度是:n中1的个数(始终小于32)。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8871204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档