我有两个字节,例如 01010101 和 11110000。我需要连接第二个字节“1111”的四个最高有效位和第一个完整字节,结果类似于 0000010101011111,即填充四个零,第一个完整字节,最后是第二个字节的四个最高有效位。
任何的想法?
我有两个字节,例如 01010101 和 11110000。我需要连接第二个字节“1111”的四个最高有效位和第一个完整字节,结果类似于 0000010101011111,即填充四个零,第一个完整字节,最后是第二个字节的四个最高有效位。
任何的想法?
试试这个:
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