Чистая реализация на python с использованием оператора xor ^
def neighbors(n, bits):
for bit in range(bits):
yield n ^ (2 ** bit)
Это работает с вашими примерами чисел.
>>> 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]]
Это довольно быстро и может обработать большой массив целых чисел за несколько миллисекунд.
>>> a_million_numbers = np.random.randint(0, 256, 1_000_000)
>>> %timeit array_neighbors(a_million_numbers)
67.8 ms ± 3.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)