通过单个位“跳跃”查找与给定整数相关的n位整数集

时间:2017-10-18 21:28:36

标签: python bit-manipulation bitwise-operators

给定一个n位整数,我想通过单个1与单个0的交换来找到与我的原始整数相关的n位整数集合,其中互换的1和0必须相邻

所以我想要的是找到一些函数,例如,如果我给它二进制1011(基数10中的11),它返回01111101(7和13在基地10) 即。所以这看起来像是:

>>> bit_hop(11, n=4)
[7, 13]

这个函数知道这个数字的位数是很重要的,因为我的另一个约束是我需要这个具有周期性的边界条件,例如0111不仅会返回1011而且还会{ {1}},即。二进制数的边应该相邻。

另外,如上所述,每跳只允许一次交换。这意味着1110应该返回bit_hop(1010)

有没有人对如何做到这一点有任何想法?我知道这应该包含对[1100, 0011, 1001, 0110]>><<操作的一些巧妙使用,但我在查看合成时遇到了麻烦。

1 个答案:

答案 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