我有一个字节的两个整数,因此每个整数的范围都可以在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)
谢谢
答案 0 :(得分:1)
这些操作是基本的位操作,但最后一步除外:
在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