2012-03-09 33 views
0

我想使用struct模塊將一個整數unpack()解析爲真值的列表。python中的位掩碼解析僅使用標準庫

我目前的做法是這樣的:

>>> [bool(int(_)) for _ in ("%8s" % str(bin(235)).split("b")[1]).replace(" ","0")] 
[True, True, True, False, True, False, True, True] 

它的工作,但也是相當可怕的令人費解。任何人都有優雅和pythonesque做同樣的方式?

請注意,上面只是一個例子,位掩碼不一定只有8位長,但解決方案應該適用於任意長度的位掩碼(實際上,可以使用4的倍數工作)

+0

你看了問題@DanD。 ?我說我使用'struct' - 'unpack(「?」)'不解析一個位,而是一個8位的C布爾值! – Kimvais 2012-03-09 08:14:34

回答

3

算法完成優雅,不C風格的程序正義:

size = 8 
[bool(235 & (1 << size - i - 1)) for i in xrange(size)] 
1

如何:

>>> masklen = 8 
>>> [bool(int(i)) for i in str(bin(235))[2:].rjust(masklen, '0')] 
[True, True, True, False, True, False, True, True] 
+0

啊,忘了'rjust()' - 這比我原來的方法好,但我會等待一段時間接受以防萬一發佈更優雅的解決方案:) – Kimvais 2012-03-09 08:20:11

0

所以,如果你跳過pack一步,僅使用整數:使用上的前

def bitboollist(v,n=0): 
     l = [] 
     t = v 
     while t != 0: 
       l.append(bool(t % 2)) 
       t = t/2 
     l.reverse() 
     if len(l) == 0: 
       l = [False] 
     if n > len(l): 
       l = [False]*(n-len(l)) + l 
     return l 

充足的1234產量:

>>> bitboollist(1234) 
[True, False, False, True, True, False, True, False, False, True, False] 
>>> bitboollist(1234,n=16) 
[False, False, False, False, False, True, False, False, True, True, False, True, False, False, True, False]