Jay*_*Fix 12 python floating-point bit-manipulation
在Python V.2.5.4中,我有一个浮点数,我想获取并操作(作为整数)浮点数的位模式.
例如,假设我有
x = 173.3125
Run Code Online (Sandbox Code Playgroud)
在IEEE 754格式中,x的位模式(十六进制)是x.
如何在该位模式上获取和操作(例如,执行按位操作)?
Ale*_*lli 14
你可以得到你想要的字符串(显然暗示一个大端,32位表示; Python内部使用本机字节序和64位浮点数)与struct模块:
>>> import struct
>>> x = 173.125
>>> s = struct.pack('>f', x)
>>> ''.join('%2.2x' % ord(c) for c in s)
'432d2000'
Run Code Online (Sandbox Code Playgroud)
这还没有让你执行按位操作,但是你可以再次使用struct将字符串映射到int:
>>> i = struct.unpack('>l', s)[0]
>>> print hex(i)
0x432d2000
Run Code Online (Sandbox Code Playgroud)
现在你有一个int你可以在任何类型的按位操作中使用的(如果在所述操作之后需要float再次获取,则按相同的两个步骤反向).
for*_*ran 11
问题是Python浮点对象可能不是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
Run Code Online (Sandbox Code Playgroud)
然后回来:
y = cast(pointer(c_int32(bits)), POINTER(c_float)).contents.value
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6087 次 |
| 最近记录: |