Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取&;将浮点的位模式操作为整数_Python_Floating Point_Bit Manipulation - Fatal编程技术网

Python 获取&;将浮点的位模式操作为整数

Python 获取&;将浮点的位模式操作为整数,python,floating-point,bit-manipulation,Python,Floating Point,Bit Manipulation,在Python2.5中,我有一个浮点,我想获取并操作它的位模式作为一个整数 例如,假设我有 x = 173.3125 在IEEE 754格式中,x的十六进制位模式是432D5000 我如何获取和操作(例如,执行位操作)该位模式?我对该主题不太熟悉,但您尝试过该模块吗?问题是Python浮点对象可能不是IEEE 754,因为它是一个对象(事实上,他们是,但在内部,他们可以持有更方便的代表权) 正如leo所说,您可以使用ctypes进行类型转换,因此您要强制执行特定的表示(在本例中为单精度表示):

在Python2.5中,我有一个浮点,我想获取并操作它的位模式作为一个整数

例如,假设我有

x = 173.3125
在IEEE 754格式中,
x
的十六进制位模式是
432D5000


我如何获取和操作(例如,执行位操作)该位模式?

我对该主题不太熟悉,但您尝试过该模块吗?

问题是Python浮点对象可能不是IEEE 754,因为它是一个对象(事实上,他们是,但在内部,他们可以持有更方便的代表权)

正如leo所说,您可以使用ctypes进行类型转换,因此您要强制执行特定的表示(在本例中为单精度表示):

然后返回:

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

您可以通过
struct
模块获得所需的字符串(显然意味着一个大端,32位表示;Python内部使用本机端,64位表示浮点):

>>> import struct
>>> x = 173.125
>>> s = struct.pack('>f', x)
>>> ''.join('%2.2x' % ord(c) for c in s)
'432d2000'
>>> import struct
>>> x = 173.3125
>>> rep = struct.pack('>f', x)
>>> numeric = struct.unpack('>I', rep)[0]
>>> '%x' %numeric
'432d5000'
这还不允许执行逐位操作,但可以再次使用struct将字符串映射为int:

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

现在您有了一个
int
,可以在任何类型的按位操作中使用它(如果在所述操作之后需要再次获得
浮点值,请按照相同的两个相反步骤进行操作)。

使用
struct
xdrlib
模块:

>>> import struct
>>> x = 173.125
>>> s = struct.pack('>f', x)
>>> ''.join('%2.2x' % ord(c) for c in s)
'432d2000'
>>> import struct
>>> x = 173.3125
>>> rep = struct.pack('>f', x)
>>> numeric = struct.unpack('>I', rep)[0]
>>> '%x' %numeric
'432d5000'
现在,您可以使用
numeric
,然后以相反的方向返回浮点数。您必须使用>I(unsigned int)来避免获取负数。
xdrlib
类似


参考资料:,。

作为参考,还可以使用numpy和view

import numpy

def fextract( f ):
  bits = numpy.asarray( f, dtype=numpy.float64 ).view( numpy.int64 )
  if not bits & 0x7fffffffffffffff: # f == +/-0
    return 0, 0
  sign = numpy.sign(bits)
  exponent = ( (bits>>52) & 0x7ff ) - 1075
  mantissa = 0x10000000000000 | ( bits & 0xfffffffffffff )
  # from here on f == sign * mantissa * 2**exponent
  for shift in 32, 16, 8, 4, 2, 1:
    if not mantissa & ((1<<shift)-1):
      mantissa >>= shift
      exponent += shift
  return sign * mantissa, exponent

fextract( 1.5 ) # --> 3, -1
导入numpy
def提取液(f):
bits=numpy.asarray(f,dtype=numpy.float64).view(numpy.int64)
如果不是位&0x7fffffffffffffffff:#f==+/-0
返回0,0
符号=numpy.符号(位)
指数=((位>>52)和0x7ff)-1075
尾数=0x100000000000 |(位&0xfffffffffffff)
#从这里开始f==符号*尾数*2**指数
对于32、16、8、4、2、1档的换档:
如果不是尾数&(1=移位)
指数+=移位
返回符号*尾数,指数
fextract(1.5)#-->3,-1

感谢所有提供答案的人。我能够获得这两种技术(1种使用ctypes,2种使用struct)工作。我不知道哪个更可取。似乎使用结构的打包和解包提供了一个独立于表示的解决方案,但如果我错了,请纠正我。此外,我想知道“ctypes”和“struct”解决方案之间是否存在显著的性能差异。@JaysonFix:1)你是说平台独立吗?如果是这样,而且你对endianism很明确,我想答案是肯定的。2)是否有足够的差异对您来说很重要取决于您将要做什么…数百万次的操作?如果是这样,您应该自己进行基准测试,这样您就可以了解其中的含义,无论是在性能方面,还是在易用性和可维护性方面。您好,您能解释一下为什么为big-endian指定“>”吗正确,但我不清楚endian(大,小)扮演什么角色…在Python3中,只为
c
切换
ord(c)
,因为
s
现在是一个
bytes
对象。