我试图确定比特串(比如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.
我觉得必须有一个更好的方法,因为我只想找到支配者。也许我只是使用了错误的名字?
答案 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();
。最后,如果你的堆栈不是空的,我认为你的问题已经解决了。