获取和操纵浮点数的位模式作为整数
在Python 2.5中,我有一个浮点数,我想把它的位模式当成整数来获取和操作。
比如说,我有
x = 173.3125
在IEEE 754格式中,x
的位模式用十六进制表示是432D5000
。
我该如何获取这个位模式并进行操作(比如说,进行位运算)呢?
4 个回答
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
,只需反向执行前面那两步)。