如何在Python中连接位

joh*_*518 4 python

我有两个字节,例如01010101和11110000.我需要连接第二个字节"1111"和第一个整个字节的四个最高有效位,结果像0000010101011111,即填充四个零,第一个整个字节,最后是第二个字节的四个最高有效位.

任何的想法?

nio*_*nio 12

试试这个:

first = 0b01010101
second = 0b11110000
res = (first<<4) | (second>>4)
print bin(res)
Run Code Online (Sandbox Code Playgroud)

通过将第一个字节向左移位4位,(first<<4)您将添加4个尾随零位.第二部分(second>>4)将移出到第二个字节的右4个LSB位以丢弃它们,因此只剩下4个MSB位,然后你可以按位或者将两个部分结果(|在python中)组合起来.

分裂结果回来了

要回答@JordanMackie的问题,你可以将res后面的数据拆分为两个变量,只需要从原来的4个最低有效位中删除second.

first = 0b01010101
second = 0b11110000
res = (first<<4) | (second>>4)
print ("res    : %16s" %(bin(res)) )

first2 = (res>>4) & 255
second2 = (res&0b1111)<<4

print ("first2 : %16s" % (bin(first2)) )
print ("second2: %16s" % (bin(second2)) )
Run Code Online (Sandbox Code Playgroud)

输出如下:

res    :    0b10101011111
first2 :        0b1010101
second2:       0b11110000
Run Code Online (Sandbox Code Playgroud)

第一个命令提取原始的第一个字节.它将来自second变量的4个LSB位移位到右侧(运算符>>),因此它们将被丢弃.下一个逻辑和操作&仅保留操作的8个最低位,并且丢弃任何额外的高位:

first2 = (res>>4) & 255
Run Code Online (Sandbox Code Playgroud)

其中第二个命令只能恢复second变量的4个MSB位.它res仅从属于second使用逻辑乘法(&)的ult中选择4 LSB .(任何&1 =任何东西,任何东西&0 = 0).丢弃较高位,因为它们与0位进行"与"运算.

接下来,这4位向左移位.零位出现在4个最低有效位位置:

second2 = (res&0b1111)<<4
Run Code Online (Sandbox Code Playgroud)