有符号浮点数转十六进制数
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<<16
或 65536
中)并转换乘积为整数:
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,或者您可以为其他类型的舍入添加额外的代码。您可能还想添加代码来处理溢出。
如何将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<<16
或 65536
中)并转换乘积为整数:
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,或者您可以为其他类型的舍入添加额外的代码。您可能还想添加代码来处理溢出。