def HammingNeighbors(n, dist, numBits):
"""Returns list of numbers that are given hamming distance away
from an integer.
n : an integer
dist : Hamming distance
bits : number of bits of neighbors
"""
if dist < 0:
raise Exception, 'Invalid distance'
onesMask = int('1'*numBits, 2)
# Cur array maintains the invariant that for some dist d,
# Cur[i] holds all numbers that that are d distance
# away from lower i-bits of n
# dist == 0
Cur = [[n % (1 << _)] for _ in range(numBits+1)]
# dist > 0
for d in range(1, dist+1):
Prev = Cur
Cur = [[] for _ in range(numBits+1)]
for i in range(d, numBits+1):
# n's i-th bit and its inversion
iBit = n & (1<<i-1)
iBitInv = iBit ^ (1<<i-1)
Cur[i] = [iBitInv + x for x in Prev[i-1]] + \
[iBit + x for x in Cur[i-1]]
return Cur[numBits]