特殊按位操作

时间:2018-03-04 13:25:30

标签: bit-manipulation bitwise-operators logical-operators

我想对一组数字执行按位运算。 让我们假设数字11,18,2和8.操作如下:

01011
10010
00010
01000

01010 (ans)

n为偶数时的逻辑 - 对于一组n个数,如果至少n / 2 +1个数的第i位设置为零,则结果的第i位为0。 如果至少n / 2个数字的第i位设置为1

,则结果的第i位为1

当n为奇数时的逻辑 - 对于一组n个数,如果至少(n + 1)/ 2个数字的第i位设置为零,则结果的第i位为0。 如果至少(n + 1)/ 2个数字的第i位设置为1,则结果的第i位为1

简而言之:如果零位多于一位,那么该位置的结果将为零,否则结果将为一位

最快的计算方法是什么?

操作应该是关联的。 这些数字是32位长,可以有100000个数字。

1 个答案:

答案 0 :(得分:1)

我建议你使用一个运行32次的循环执行此操作,对于数字中的每个位执行一次。

你屏蔽除了你想要的所有位,添加屏蔽数字并查看结果 - 它给你1位数。

E.g。像这样的东西:

numbers = [ ..... ]
for i in range(32):
    s = 0
    for i in range(len(numbers)):
        s + = (numbers[i] & 1)
        numbers[i] = numbers[i] >> 2
    if s < n / 2:
        ...
    else:
        ...

我还没有测试过,但你可以看到它的发展方向。

可能更快的另一个想法是只循环你的数字一次并记住谁赢了 - 并行的所有32位的0或1。您可以为此使用四个字节查找表,并在一个数组中保留32个计数器,这些计数器将通过查找的值进行更新。