特殊的按位操作

我想对一组数字执行按位操作。 我们假设数字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个数字。


我建议你用循环运行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个计数器保存在由查找值更新的数组中。

链接地址: http://www.djcxy.com/p/57575.html

上一篇: Special bitwise operation

下一篇: Saturating Signed Integer Multiplication with Bitwise Operators