十进制数的二进制邻居

时间:2018-11-08 16:54:55

标签: python numpy

假设我在02^L之间有十进制数字。这些十进制数字中的每一个都可以表示为长度为L的二进制数字。我现在对一个函数有一个兴趣,该函数采用一个十进制数字,然后计算所有L十进制数字,其二进制表示仅在一个位置不同。我对这个问题的最快解决方案感兴趣。 示例:

L=3--> Numbers between 0 and 7 F(2) = (0,3,6) since 2= 010 -> 0=000, 3=011, 6=110

希望您有个主意,并预先致谢:)

2 个答案:

答案 0 :(得分:3)

使用xor运算符public address: (Address | any) = {};

的纯python实现
^

它适用于您的示例编号。

def neighbors(n, bits):
    for bit in range(bits):
        yield n ^ (2 ** bit)

这是一个numpy解决方案,它可以根据一系列数字创建外积。

>>> list(neighbors(2, 3))
[3, 0, 6]

输出是一个二维数组,每个输入数字一行,并且列对应于翻转的位位置。

import numpy as np

def array_neighbors(numbers, bits=8):
    flip_bits = 2 ** np.arange(bits)
    return np.bitwise_xor.outer(numbers, flip_bits)

这非常快,可以在几毫秒内处理大量整数。

>>> array_neighbors([0,1,2,3,4,5,6,7], 3)
[[1 2 4]
 [0 3 5]
 [3 0 6]
 [2 1 7]
 [5 6 0]
 [4 7 1]
 [7 4 2]
 [6 5 3]]

答案 1 :(得分:3)

您可以使用移位来做到这一点:

def neighbors(n, bitLength):
    return map(lambda b: n ^ (1 << b), range(bitLength))

>>> print(list(neighbors(2, 3)))
[3, 0, 6]

它们是用经典计算机可以完成的最快的数学运算,对于2的幂,它们是完美的。