Получите и управляйте комбинацией двоичных разрядов плавания как целое число

В Python 2.5 у меня есть плавание, и я хотел бы получить и управлять его комбинацией двоичных разрядов как целым числом.

Например, предположите, что я имею

x = 173.3125

В формате IEEE 754, xкомбинация двоичных разрядов в шестнадцатеричном 432D5000.

Как я могу получить и управлять (например, выполнить битовые операции) на той комбинации двоичных разрядов?

12
задан wjandrea 5 October 2019 в 04:25
поделиться

4 ответа

Вы можете получить нужную строку (очевидно, подразумевая 32-битное представление с прямым порядком байтов; Python внутренне использует собственный порядок байтов и 64-битные значения для чисел с плавающей запятой) с помощью структуры struct модуль:

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

это еще не позволяет выполнять побитовые операции, но затем вы можете снова использовать структуру для отображения строки в int:

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

, и теперь у вас есть int , который вы может использоваться в любых побитовых операциях (выполните те же два шага в обратном порядке, если после указанных операций вам снова нужно получить float ).

14
ответ дан 2 December 2019 в 05:15
поделиться

Проблема в том, что плавающий объект Python может не соответствовать стандарту IEEE 754, потому что это объект (на самом деле так и есть, но внутри они могут содержать любое более удобное представление) ...

Как сказал Лео, вы можете выполнить приведение типа с помощью 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
11
ответ дан 2 December 2019 в 05:15
поделиться

Я не слишком разбираюсь в этой теме, но пробовали ли вы модуль ctypes ?

0
ответ дан 2 December 2019 в 05:15
поделиться

Используйте struct или xdrlib модуль:

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

Теперь вы можете работать с numeric , а затем перейдите в обратном направлении, чтобы вернуть ваше число с плавающей запятой. Вы должны использовать> I (unsigned int), чтобы не получить отрицательное число. xdrlib аналогичен.

Ссылки: struct , xdrlib .

2
ответ дан 2 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: