Преобразовать биты в серию байтов - PullRequest
1 голос
/ 21 февраля 2011

С учетом целого числа Python размером 4 бита, как его преобразовать - ndash; с побитовой арифметикой вместо обработки строк & ndash; в целое число размером 4 байта, для которого каждый бит в оригинале соответствует байту, который повторяется 8 раз?

Например: 0b1011 должно стать 0b11111111000000001111111111111111

Ответы [ 3 ]

4 голосов
/ 21 февраля 2011

С извинениями перед ncoghlan:

expanded_bits = [
    0b00000000000000000000000000000000,
    0b00000000000000000000000011111111,
    0b00000000000000001111111100000000,
    0b00000000000000001111111111111111,
    0b00000000111111110000000000000000,
    0b00000000111111110000000011111111,
    0b00000000111111111111111100000000,
    0b00000000111111111111111111111111,
    0b11111111000000000000000000000000,
    0b11111111000000000000000011111111,
    0b11111111000000001111111100000000,
    0b11111111000000001111111111111111,
    0b11111111111111110000000000000000,
    0b11111111111111110000000011111111,
    0b11111111111111111111111100000000,
    0b11111111111111111111111111111111,
    ]

Затем просто проиндексируйте этот список с полубайтом, который вы хотите преобразовать:

>>> bin(expanded_bits[0b1011])
"0b11111111000000001111111111111111"
1 голос
/ 21 февраля 2011

Я бы просто сделал цикл:

x = 0b1011
y = 0
for i in range(4):
    if x & (1 << i):
        y |= (255 << (i * 8))
print "%x" % y
0 голосов
/ 21 февраля 2011

В следующем рекурсивном решении используются только операторы сложения, сдвига влево / вправо и побитовый оператор & с целыми числами:

def xform_rec(n):
    if n == 0:
        return 0
    else:
        if 0 == n & 0b1:
            return xform_rec(n >> 1) << 8
        else:
            return 0b11111111 + (xform_rec(n >> 1) << 8)

Или в виде однострочного:

def xform_rec(n):
    return 0 if n == 0 else (0 if 0 == n & 0b1 else 0b11111111) + (xform_rec(n >> 1) << 8)

Примеры:

>>> print bin(xform_rec(0b1011))
0b11111111000000001111111111111111
>>> print bin(xform_rec(0b0000))
0b0
>>> print bin(xform_rec(0b1111))
0b11111111111111111111111111111111)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...