寻找主导地位

时间:2014-06-28 15:35:20

标签: bit-manipulation

我试图确定比特串(比如64位长)是否至少为50%。我已经四处寻找并观察了伟大的http://graphics.stanford.edu/~seander/bithacks.html,但我还没有找到专门针对此问题的内容。

我可以将字符串拆分为8位块,预先计算每个块中的1的数量,然后在8次查找和7次添加中找到结果。

逐字方法的示例:

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

我觉得必须有一个更好的方法,因为我只想找到支配者。也许我只是使用了错误的名字?

2 个答案:

答案 0 :(得分:2)

您可以使用divide and concur解决方案here,它很容易适应32位。或者可能只是一个popcnt指令,具体取决于您的硬件。然后你只检查那个值是否小于32,如果是0则支配,否则1s支配。

链接中的代码适用于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;
}

答案 1 :(得分:0)

我认为最好使用Stack数据结构。输入位为1时,push(1);。否则从您的堆栈顶部pop();。最后,如果你的堆栈不是空的,我认为你的问题已经解决了。