Python распределяют 8 бит в началах 4 х 8 бит, два на два - PullRequest
0 голосов
/ 22 марта 2020

У меня есть целое число, которое составляет 8 битов, и я хочу распределить эти биты в начала 4 целых числа (4x8 бит) два на два. Например:

bit_8 = 0b_10_11_00_11
bit_32 = b"\x12\x32\x23\54" # --> [0b100_10, 0b1100_10, 0b1000_11, 0b1011_00]

what_i_want = [0b100_10, 0b1100_11, 0b1000_00, 0b1011_11]

Для удобства чтения я записал числа в список, но я хочу, чтобы они были bytes. Я не очень хорош в битовых манипуляциях, и я не мог найти хороший способ. Я повторю этот процесс много раз, поэтому мне нужно быстрое решение. Я нашел способ установить биты один за другим в здесь , но мне интересно, есть ли лучший способ для моей проблемы.

Язык не так важен, мне нужен алгоритм. Тем не менее я предпочитаю Python.

1 Ответ

1 голос
/ 22 марта 2020

Вы можете сделать это, выполнив итерацию в обратном направлении на bit_32, и в то же время взять последние два бита bit_8, затем сдвинув его вправо. Таким образом, вы можете создать список выходных значений в обратном порядке, который вы можете изменить при преобразовании в байты.

bit_8 = 0b_10_11_00_11
bit_32 = b"\x12\x32\x23\54" # --> [0b100_10, 0b1100_10, 0b1000_11, 0b1011_00]

what_i_want = [0b100_10, 0b1100_11, 0b1000_00, 0b1011_11]

out_lst = []
for b in reversed(bit_32):
    bits_from_bit_8 = bit_8 & 0b11  # last two bits of bit_8
    bit_8 >>= 2  # we shift it right by to bits 
    out_lst.append(b & 0b11111100 | bits_from_bit_8) 
out = bytes(reversed(out_lst))

print(out)
#b'\x123 /'

# Check that this is the expected output:
print([i for i in out], what_i_want)
# [18, 51, 32, 47] [18, 51, 32, 47]
...