【问题标题】:Finding the set of n-bit integers related to a given integer by single bit 'hopping'通过单个位“跳跃”查找与给定整数相关的 n 位整数集
【发布时间】:2017-10-18 21:28:35
【问题描述】:

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

所以我想要找到一些函数,例如,如果我给它二进制 1011(以 10 为底的 11)它返回 01111101(以 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))^nn=1010 的这两个都给出了 0101 这不是一个有效的输出。

标签: python bit-manipulation bitwise-operators


【解决方案1】:

要直接在二进制中执行此操作,您必须注意有关算法的几件事。首先它总是处理相邻的位,除了从第一位循环到最后一位。其次,这些位必须不同,如果它们相同,则交换它们不会有任何作用。

此代码围绕值遍历 2 位掩码并测试位是否不同,然后使用异或交换它们。

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

【讨论】:

  • 是的,这是一个非常好的、优雅的解决方案!
猜你喜欢
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2012-01-08
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多