2010-03-23 38 views
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++的元編程模板。我知道我明確指定了語言,但在我看來,它仍然是不可知的

你能想出更好的方法/更聰明的方法嗎? 謝謝

回答

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) 
+0

吧,我在某種位/遞歸方法感興趣,雖然 – Anycorn 2010-03-23 21:53:49

3

只是異或的二進制1111的值 - 這將翻轉四位,給你其他兩個。

cd = ab^0xF; 
+0

不給位置 – Anycorn 2010-03-23 21:54:16

+2

@aaa 如何你想要這個職位嗎? 給我們你希望看到的功能界面。函數返回什麼? – Pyrolistical 2010-03-23 22:17:20

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] 
相關問題