有符号浮点数转十六进制数

Signed float to hexadecimal number

如何将float转换为十六进制的特定格式:

符号1位,整数15位,小数点后16位。

示例输出应为 -0.6543861 的 ffff587a,-12.897631 的 fff31a35,107.8674316 的 006bde10,59.8132324 的 003bd030

我写了一个可以进行无符号转换的程序,我卡在了有符号的部分。谁能指导我如何以非常紧凑的方式实现这一目标?

def convert(num):
    binary2 = ""
    Int = int(num)
    fract = num - Int
    binary = '{:16b}'.format(Int & 0b1111111111111111)

    for i in range (16):
        fract *= 2
        fract_bit = int(fract)
        if fract_bit == 1:
            fract -= fract_bit
            binary2 += '1'
        else:
            binary2 += '0'

    return int(binary + binary2, 2)

value = 107.867431640625
x = convert(value)

hex(x)

输出:0x6bde10

这就是Q16.16定点格式。要将浮点数转换为这种格式,只需将其乘以 216(在 Python、1<<1665536 中)并转换乘积为整数:

y = int(x * (1<<16))

要显示它的32位二进制补码表示,如果是负数则加232然后转成16进制:

y = hex(y + (1<<32 if y < 0 else 0))

例如,下面打印“0xfff31a35”:

#!/usr/bin/python

x=-12.897631
y = int(x * (1<<16))
y = hex(y + (1<<32 if y < 0 else 0))
print(y)

此转换截断。如果您想要舍入,可以在 int 内添加 .5,或者您可以为其他类型的舍入添加额外的代码。您可能还想添加代码来处理溢出。