【问题标题】:Count bits in the number [duplicate]计算数字中的位数[重复]
【发布时间】:2009-05-09 17:52:09
【问题描述】:

复制:

Best algorithm to count the number of set bits in a 32-bit integer?


假设你有一个号码。有没有办法计算该数字的二进制表示中等于 1 的位,而不是使用迭代?我的意思是,有没有办法使用一些按位运算符和掩码在恒定时间内做到这一点。我需要适用于 32 位和 64 位架构的解决方案。啊差点忘了,我需要C语言或者汇编也不错。

【问题讨论】:

  • FWIW,对于一个恒定大小的数字,迭代恒定时间。
  • 是的,虽然严格的提问者没有它是固定长度的;对于任意位长度 n,它是正确的 O(n)。

标签: c assembly bit-manipulation bitmask


【解决方案1】:

【讨论】:

    【解决方案2】:

    嗯,当然有,但你不会喜欢的。

    当然,您可以构建一个包含所有正确值的查找表:

    table[1] = 1,table[2] = 1,table[3] = 2,等等

    所以,这会给你一个非常快的答案,但它本身是一个完全没用的解决方案,因为表格必须非常非常大。

    你可以稍微优化一下,但它只需要一点点迭代。只需创建一个 8 位版本的表解决方案,一个只有 256 个条目的表,然后遍历要检查的值中的每个 BYTE,对表查找的结果求和。比如:

    short int tableLookup[256] = { 0, 1, 1, 2, 1, ... };
    unsigned int valueToCheck = 89392491;
    int result = 0;
    while ( valueToCheck != 0 ) {
       result += tableLookup[ (valueToCheck & 0xFF) ];
       valueToCheck >>= 8;
    }
    // result should now have the correct bit count, if the table is correct.
    

    嗯,这似乎是众所周知的(在这里我是在做这件事): http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive

    【讨论】:

    • 比尔,有一些更巧妙的方法可以做到;点击链接到 dup。
    • 明确的答案,但您可能需要 unsigned int valueToCheck 否则右移是算术的,并且会保留符号位,这将防止循环终止。如果 valueToCheck 是某种类型的大数,您希望使用逻辑右移来执行此操作。
    • 当然,当然,肯定有其他方法可以做到这一点。 @RBerteig,你可能是对的,自从我不得不处理 C 的模棱两可的转变已经有一段时间了。
    【解决方案3】:

    是的,您可以通过使用 look up table 来做到这一点。

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2023-04-08
      • 2021-06-03
      • 1970-01-01
      相关资源
      最近更新 更多