特殊的按位操作

问题描述 投票:-2回答:1

我想对一组数字执行按位运算。我们假设数字为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

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

什么是最快的计算方法?

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

bit-manipulation bitwise-operators logical-operators
1个回答
1
投票

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

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

例如。这样的事情:

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个计数器,这些计数器将通过查找的值进行更新。

© www.soinside.com 2019 - 2024. All rights reserved.