在Python中将16位整数拆分为两个8位整数

12 投票
7 回答
26999 浏览
提问于 2025-04-16 00:28

我需要把一个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<<82**80x100 或者 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位的值,而不管容器里装的是什么。

撰写回答