Python将8位分配到4 x 8位的开头,两个接两个

Python将8位分配到4 x 8位的开头,两个接两个,python,bit-manipulation,bitwise-operators,Python,Bit Manipulation,Bitwise Operators,我有一个8位的整数,我想把这些位分成4个整数(4x8位)的开头,2乘2。例如: 位8=0b\u 10\u 11\u 00\u 11 位32=b“\x12\x32\x23\54”#-->[0b100\U 10、0b1100\U 10、0b1000\U 11、0b1011\U 00] 我想要什么=[0b100\u10,0b1100\u11,0b1000\u00,0b1011\u11] 为了可读性,我在列表中写了数字,但我希望它们是字节。我不太擅长比特操作,我找不到一个好方法。 我会重复这个过程很多

我有一个8位的整数,我想把这些位分成4个整数(4x8位)的开头,2乘2。例如:

位8=0b\u 10\u 11\u 00\u 11
位32=b“\x12\x32\x23\54”#-->[0b100\U 10、0b1100\U 10、0b1000\U 11、0b1011\U 00]
我想要什么=[0b100\u10,0b1100\u11,0b1000\u00,0b1011\u11]
为了可读性,我在列表中写了数字,但我希望它们是
字节
。我不太擅长比特操作,我找不到一个好方法。 我会重复这个过程很多次,所以我需要一个快速的解决方案。我找到了一种一点一点设置的方法,但我想知道是否有更好的方法来解决我的问题


语言不是那么重要,我需要一个算法。尽管如此,我还是更喜欢Python。

您可以通过对
位32
进行反向迭代,同时获取
位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]