在Python中将16位整数拆分为两个8位整数
我需要把一个16位的整数转换成两个8位的整数,然后把这两个8位的整数作为输出使用。接下来,这两个8位的整数会被重新组合成16位的输入(这部分我无法控制)。我的解决方案是可行的,但我觉得有点不太干净。对于粗略的数字,我是通过位移原始数字来处理的,而对于精细的数字,我是用它对256取模。
那么,我应该对粗略的数字进行向下取整的除法,还是应该取精细数字的最低8位(如果是这样的话,怎么做呢)?
或者说我是不是有点疯狂,使用两种不同的方法来拆分这个数字其实并没有问题?
def convert(x):
''' convert 16 bit int x into two 8 bit ints, coarse and fine.
'''
c = x >> 8 # The value of x shifted 8 bits to the right, creating coarse.
f = x % 256 # The remainder of x / 256, creating fine.
return c, f
7 个回答
2
你应该保持一致。如果你想进行数学运算,就用取模和除法;如果只是想处理二进制位,那就用位移和掩码。
9
在Python中,位运算并没有什么特别的好处,所以我建议使用:
c, f= divmod(your_number, 256)
编辑:为了让那些对二的幂不太了解的人(如果真有这样的人)更容易理解,你可以把简单的 256
替换成更有趣的写法,比如 1<<8
、2**8
、0x100
或者 0400
(在Python 3中是 0o400
)。自从Python 2.5以来,代码优化器会把这些写法都处理成和 256
一样的值(我说的前两种写法是可以计算出 256
的表达式;后两种写法则是直接表示 256
)。
$ python
Python 2.6.4 (r264:75706, Dec 7 2009, 18:45:15)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> dis.dis(compile("c, f= divmod(your_number, 1<<8)", "", "exec"))
1 0 LOAD_NAME 0 (divmod)
3 LOAD_NAME 1 (your_number)
6 LOAD_CONST 3 (256)
9 CALL_FUNCTION 2
12 UNPACK_SEQUENCE 2
15 STORE_NAME 2 (c)
18 STORE_NAME 3 (f)
21 LOAD_CONST 2 (None)
24 RETURN_VALUE
18
我会这样做:
c = (x >> 8) & 0xff
f = x & 0xff
这样更安全,看看例如:
>>> (10303 >> 8) & 0xff
40
>>> (1030333333 >> 8) & 0xff
163
>>> (1030333333 >> 8)
4024739
因为在Python中,你无法控制一个数字是否是16位的,所以你需要把它强制转换成最多16位的值。如果你确定它就是16位的值,这一步就不必要了。但这样做的话,函数就更通用了,可以让你只关注16位的值,而不管容器里装的是什么。