假设我在0
和2^L
之间有十进制数字。这些十进制数字中的每一个都可以表示为长度为L
的二进制数字。我现在对一个函数有一个兴趣,该函数采用一个十进制数字,然后计算所有L
十进制数字,其二进制表示仅在一个位置不同。我对这个问题的最快解决方案感兴趣。
示例:
L=3--> Numbers between 0 and 7
F(2) = (0,3,6)
since
2= 010 -> 0=000, 3=011, 6=110
希望您有个主意,并预先致谢:)
答案 0 :(得分:3)
使用xor运算符public address: (Address | any) = {};
^
它适用于您的示例编号。
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的幂,它们是完美的。