我想对一组数字执行按位运算。 让我们假设数字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个数字。
答案 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个计数器,这些计数器将通过查找的值进行更新。