5

我有两个字节,例如 01010101 和 11110000。我需要连接第二个字节“1111”的四个最高有效位和第一个完整字节,结果类似于 0000010101011111,即填充四个零,第一个完整字节,最后是第二个字节的四个最高有效位。

任何的想法?

4

1 回答 1

15

试试这个:

first = 0b01010101
second = 0b11110000
res = (first<<4) | (second>>4)
print bin(res)

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

拆分结果返回

要回答@JordanMackie 的问题,您可以将res后面拆分为两个变量,只是您会从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)) )

输出如下所示:

res    :    0b10101011111
first2 :        0b1010101
second2:       0b11110000

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

first2 = (res>>4) & 255

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

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

second2 = (res&0b1111)<<4
于 2013-10-31T11:48:10.573 回答