给定一个n位整数,我想通过单个1与单个0的交换来找到与我的原始整数相关的n位整数集合,其中互换的1和0必须相邻
所以我想要的是找到一些函数,例如,如果我给它二进制1011
(基数10中的11),它返回0111
和1101
(7和13在基地10)
即。所以这看起来像是:
>>> bit_hop(11, n=4)
[7, 13]
这个函数知道这个数字的位数是很重要的,因为我的另一个约束是我需要这个具有周期性的边界条件,例如0111
不仅会返回1011
而且还会{ {1}},即。二进制数的边应该相邻。
另外,如上所述,每跳只允许一次交换。这意味着1110
应该返回bit_hop(1010)
有没有人对如何做到这一点有任何想法?我知道这应该包含对[1100, 0011, 1001, 0110]
,>>
和<<
操作的一些巧妙使用,但我在查看合成时遇到了麻烦。
答案 0 :(得分:2)
要直接以二进制方式执行此操作,您必须注意有关算法的一些事项。首先,它总是处理相邻的位,除了从第一位到最后一位的循环。其次,这些位必须是不同的,如果它们相同,则交换它们就不会做任何事情。
此代码遍历值的2位掩码并测试以查看位是否不同,然后使用exclusive-或交换它们。
def bit_hop(x, n):
for i in range(n-1):
mask = 3 << i
if x & mask != 0 and x & mask != mask:
yield x ^ mask
mask = (1 << (n-1)) | 1
if x & mask != 0 and x & mask != mask:
yield x ^ mask