bit-manipulation - 找到主导位

标签 bit-manipulation

我正在尝试确定一个位串(例如 64 位长)是否至少有 50% 为 1。我四处搜寻并查看了伟大的http://graphics.stanford.edu/~seander/bithacks.html ,但我还没有找到专门针对这个问题的任何内容。

我可以将字符串分成8位 block ,预先计算每个 block 中1的数量,然后通过8次查找和7次加法找到结果。

按字节方法的示例:

10001000 10000010 00111001 00001111 01011010 11001100 00001111 11110111
2      + 2      + 4      + 4      + 4      + 4      + 4      + 7        = 31
    hence 0 dominates.

我只是觉得一定有更好的方法,因为我只是想找到统治者。也许我只是用了错误的名字?

最佳答案

您可以使用分而治之的解决方案 here ,很容易适配32位。或者可能只是一个 popcnt 指令,具体取决于您的硬件。然后你只需检查该值是否小于 32,如果是,则 0 占主导地位,否则 1 占主导地位。

链接中的代码适用于 64 位并插入了支配逻辑: (我在末尾额外右移了 5 位,以检查同一移位中设置的位是否大于 31)

int AtLeastHalfOnes(long long i) {
  i = i - ((i >> 1) & 0x5555555555555555LL);
  i = (i & 0x3333333333333333LL) + ((i >> 2) & 0x3333333333333333LL);
  return (((i + (i >> 4)) & 0x0F0F0F0F0F0F0F0FLL) * 0x0101010101010101LL) >> 61;
}

关于bit-manipulation - 找到主导位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24468350/

相关文章:

php - 对可变位宽二进制 block 中的十进制值进行编码/解码

c# - 按位与如何与 bool 值交互?

c# - 按位或 | 是什么意思运营商呢?

C - 非 2 的幂数的模数按位运算的算法

javascript - 按位运算符比 + 和 - 运算符更快

sql - 有没有一种优雅的方法来反转 SQL 插入语句中的位值?

c - 在 C 中打印 64 位值

java - 在位置 0 处插入字节并右移剩余数据位

c# - 使用SOLR计算两个ulong之间的 "similarity"/"bitcount"

c - 如何从字节数组中提取少量位或字节?