仅使用标准库在python中进行位掩码解析

时间:2012-03-09 07:44:25

标签: python parsing bitmask

我想使用unpack()模块将struct整数解析为真值列表。

我目前的做法是:

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

它完成了这项工作,但却非常令人费解。任何人都有优雅和 pythonesque 的方式做同样的事情?

请注意,上面仅仅是一个示例,并且位掩码不一定只有8位长,但解决方案应该适用于任意长度的位掩码(实际上,使用4的倍数可能没问题)< / p>

3 个答案:

答案 0 :(得分:3)

算法优雅,没有C风格的程序主义:

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

答案 1 :(得分:1)

怎么样:

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

答案 2 :(得分: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]