Python 2.7 concat字节

时间:2019-06-06 09:13:41

标签: python-2.7 bit-manipulation bitwise-operators

我有一个字节的两个整数,因此每个整数的范围都可以在0-255之间。 假设

    a = 247
    b = 8

现在每个的二进制表示为:

   a = 11110111
   b = 00001000

我需要进行以下操作:

1)Concat这两个二进制序列,因此在示例中,“ a” concat“ b”将导致:

 concat = 1111011100001000 -> that is 63240

2)仅考虑前n个最高有效位,假设前10位,结果如下:

 msb = 1111011100000000

3)恢复位顺序,这将导致:

 reverse = 0001000011101111

对于第2个问题,我知道这只是一个移位操作,对于第3个问题,我想先转换为十六进制,然后交换然后转换为整数,但我想还有更优雅的方法。

对于数字1,我​​已经编写了此解决方案,但我正在寻找更优雅,性能更高的东西:

 a = 247
 b = 8

 first = hex(a)[2:].zfill(2)
 second = hex(b)[2:].zfill(2)

 concat = int("0x"+first+second,0)

谢谢

1 个答案:

答案 0 :(得分:1)

这些操作是基本的位操作,但最后一步除外:

  1. 247,向左移8位(=移至更高字节)
  2. 保持8位不变(=低字节)
  3. 添加这些结果
  4. 位-并使用掩码将最后6位清零
  5. 反转位顺序(不是位操作;更多方法here

在Python 2.7代码中:

a = 247 << 8
print "a = {0: >5} - {1:0>16}".format(a, bin(a)[2:])

b = 8
print "b = {0: >5} - {1:0>16}".format(b, bin(b)[2:])

c = a + b
print "c = {0: >5} - {1:0>16}".format(c, bin(c)[2:])

d = c & ~63  # 63 = 111111, ~63 is the inverse
print "d = {0: >5} - {1:0>16}".format(d, bin(d)[2:])

e = int('{:08b}'.format(d)[::-1], 2)
print "e = {0: >5} - {1:0>16}".format(e, bin(e)[2:])

输出

a = 63232 - 1111011100000000
b =     8 - 0000000000001000
c = 63240 - 1111011100001000
d = 63232 - 1111011100000000
e =   239 - 0000000011101111