获取和操纵浮点数的位模式作为整数

13 投票
4 回答
11233 浏览
提问于 2025-04-15 17:08

在Python 2.5中,我有一个浮点数,我想把它的位模式当成整数来获取和操作。

比如说,我有

x = 173.3125

在IEEE 754格式中,x的位模式用十六进制表示是432D5000

我该如何获取这个位模式并进行操作(比如说,进行位运算)呢?

4 个回答

4

使用 structxdrlib 模块:

>>> import struct
>>> x = 173.3125
>>> rep = struct.pack('>f', x)
>>> numeric = struct.unpack('>I', rep)[0]
>>> '%x' %numeric
'432d5000'

现在你可以处理 numeric(数字),然后再反向操作,把你的浮点数拿回来。你需要使用 >I(无符号整数)来避免得到负数。 xdrlib 的用法也差不多。

参考资料:structxdrlib

11

问题在于,Python中的浮点数(float)可能并不是按照IEEE 754标准来表示的,因为它实际上是一个对象(虽然它们确实是对象,但内部可能使用更方便的表示方式)...

正如leo所说,你可以使用ctypes进行类型转换,这样你就可以强制使用特定的表示方式(在这个例子中是单精度):

from ctypes import *
x = 173.3125
bits = cast(pointer(c_float(x)), POINTER(c_int32)).contents.value
print hex(bits)
#swap the least significant bit
bits ^= 1

然后再转换回来:

y = cast(pointer(c_int32(bits)), POINTER(c_float)).contents.value
16

你可以通过使用 struct 模块来获取你想要的字符串(这通常意味着使用大端格式,32位表示;而在Python内部,浮点数使用的是本机字节序和64位)。

>>> import struct
>>> x = 173.125
>>> s = struct.pack('>f', x)
>>> ''.join('%2.2x' % ord(c) for c in s)
'432d2000'

不过,这样做还不能让你进行位运算,但你可以再用 struct 把这个字符串转换成一个整数:

>>> i = struct.unpack('>l', s)[0]
>>> print hex(i)
0x432d2000

现在你就得到了一个 int,可以用来进行各种位运算(如果在这些操作后你需要再次得到一个 float,只需反向执行前面那两步)。

撰写回答