0

我正在研究一个简单的组合部分,发现我需要在给定 4 位 srring 中其他两位的位置的情况下恢复两位的位置。

例如,(0,1) 映射到 (2,3),(0,2) 到 (1,3) 等等,总共有六种组合。

我的解决方案是使用四个嵌套的三元运算符来测试位:

ab is a four bit string, with two bits set.
c = ((((ab & 1) ? (((ab & 2) ? ... ))) : 0)
abc = ab | c
recover the last bit in the same fashion from abc.

我必须澄清,不使用 for 循环,我的目标语言是 C++ 元编程模板。我知道我明确指定了语言,但在我看来它仍然是不可知的

你能想出更好/更聪明的方法吗?谢谢

4

3 回答 3

3

只需将二进制 1111 的值异或 - 这将翻转四位,给你另外两位。

cd = ab ^ 0xF;
于 2010-03-23T21:53:19.367 回答
2

问题空间相当小,因此基于 LUT 的解决方案既快速又简单。

Python:

fourbitmap = {
  3: (2, 3),
  5: (1, 3),
  6: (0, 3),
  9: (1, 2),
  10: (0, 2),
  12: (0, 1),
}

def getother2(n):
  return fourbitmap.get(n, None)
于 2010-03-23T21:51:43.860 回答
0

Python:

def unset_bits(input=0x5):
    for position in range(4):
        if not (2**position) & input:
            yield position

产量:

>>> list( unset_bits(0x1) )
[1, 2, 3]

>>> list( unset_bits(0x2) )
[0, 2, 3]

>>> list( unset_bits(0x3) )
[2, 3]
于 2010-03-23T22:01:16.923 回答