我正在研究一个简单的组合部分,发现我需要在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 ++元编程模板。我知道我明确指定了语言,但在我看来它仍然是不可知的
你能想到一个更好的方式/更聪明的方式吗? 感谢
答案 0 :(得分:3)
只需用二进制1111表示值 - 这将翻转四位,给你另外两位。
cd = ab ^ 0xF;
答案 1 :(得分: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)
答案 2 :(得分: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]