Разбор битовой маски в python с использованием только стандартной библиотеки - PullRequest
0 голосов
/ 09 марта 2012

Я хочу проанализировать целое число, unpack() ed с использованием модуля struct, в список значений истинности.

Мой текущий подход таков:

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

Это делает работу, но довольно ужасно запутано. У кого-нибудь есть элегантный и питонский способ сделать то же самое?

Обратите внимание, что выше это только для примера, и битовые маски не обязательно должны быть длиной всего 8 бит, но решение должно работать для битовой маски произвольной длины (на практике это может быть нормально, если просто работать с кратными 4)

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

Арифметика выполнена элегантно, без процедурного стиля C:

size = 8
[bool(235 & (1 << size - i - 1)) for i in xrange(size)]
1 голос
/ 09 марта 2012

Как насчет:

>>> masklen = 8
>>> [bool(int(i)) for i in str(bin(235))[2:].rjust(masklen, '0')]
[True, True, True, False, True, False, True, True]
0 голосов
/ 09 марта 2012

Так что, если вы пропустите шаг 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...