【发布时间】:2017-10-18 21:28:35
【问题描述】:
给定一个 n 位整数,我想通过单个 1 与单个 0 的交换找到与我的原始整数相关的 n 位整数集,其中交换的 1 和 0 必须相邻
所以我想要找到一些函数,例如,如果我给它二进制 1011(以 10 为底的 11)它返回 0111 和 1101(以 10 为底的 7 和 13)
IE。所以这看起来像:
>>> bit_hop(11, n=4)
[7, 13]
这个函数知道这个数字是多少位很重要,因为我的另一个约束是我需要它具有周期性边界条件,例如0111不仅会返回1011,还会返回1110,即.二进制数的边应该是相邻的。
此外,如前所述,每跳只允许进行一次交换。这意味着bit_hop(1010) 应该返回[1100, 0011, 1001, 0110]
有没有人对如何做这件事有任何想法?我知道这应该涉及到对 >>、<< 和 ^ 操作的一些巧妙使用,但我在查看合成时遇到了麻烦。
【问题讨论】:
-
为什么不
1110? 1和0一定要相邻吗? -
您可以通过对您的数字进行 1 位按位旋转异或来定位相邻的 1 和 0,并通过将这些位与 11 异或(适当对齐)来交换相邻的 1 和 0。跨度>
-
嗯,这在只有两个可能的输出时有效,即。与
1011一样,但它不能也不能与1010一起使用,这应该给[1100, 0011, 1001, 0110] -
听起来您没有通过所有检测。
-
我不确定您所说的检测是什么意思。也许我误解了您之前的评论,但我看到的您的算法仅有的两种可能变化是
(n^rotate_right(n,4))^n和(n^rotate_left(n,4))^n。n=1010的这两个都给出了0101这不是一个有效的输出。
标签: python bit-manipulation bitwise-operators