定点二进制和返回 python

Fixed point binary and back python

我对 python 还很陌生,有没有一种快速的方法可以将十进制转换为 16 位定点二进制(1 位符号 – 7 位整数 – 8 位小数)并返回python.

我想操纵二进制并将这个操纵的二进制转换回十进制。

示例1.25 -> 00000001.01000000

处理第一个小数部分 (0->1)

00000001.11000000 -> 1.75

非常感谢任何帮助。

如果你的小数部分有N位那么你只需要除以2N,因为存储的位模式实际上是实数值乘以2N。因此,对于 Q8.8,就像您的情况一样,您必须除以 256

对于上面的 00000001.01000000 和 00000001.11000000 示例:

>>> 0b0000000101000000/256.0
1.25
>>> 0b0000000111000000/256.0
1.75

您可以使用 fxpmath 进行更简单的计算。

关于 fxpmath 的信息:

https://github.com/francof2a/fxpmath

你的例子可以这样解决:

from fxpmath import Fxp

x = Fxp(1.25, True, 16, 8)      # signed=True, n_word=16, n_frac=8

x.bin(frac_dot=True)

输出:

'00000001.01000000'

现在您可以应用 OR 掩码对 1 执行 0 位 val:

y = x | Fxp('0b01.110', True, 16, 8) 

print(y.bin(frac_dot=True))
print(y)

输出:

'00000001.11000000'
1.75

numfi可以将浮点数转换为一定word/fraction长度的定点数,但不能直接操作二进制位。

您可以使用像 and/or/xor 这样的按位逻辑运算来修改位作为解决方法,对于计算量大的程序,按位运算应该比字符串评估更快

>>> from numfi import numfi  
>>> x = numfi(1.25,1,16,8)   
>>> x
numfi([1.25]) s16/8-r/s
>>> x.bin
array(['0000000101000000'], dtype='<U16')
>>> x.bin_
array(['11111110.11000000'], dtype='<U17')
>>> y = x | 0b0000000010000000
>>> y
numfi([1.75]) s16/8-r/s
>>> y.bin_
array(['00000001.11000000'], dtype='<U17')

您可以使用 Binary fractions 包。

示例:

>>> from binary_fractions import Binary
>>> b = Binary(15.5)
>>> print(b)
0b1111.1
>>> Binary(1.25).lfill(8).rfill(8)
Binary(00000001.01000000, 0, False)
>>> Binary(1.75).lfill(8).rfill(8)
Binary(00000001.11000000, 0, False)
>>> Binary('0b01.110').lfill(8).rfill(8)
Binary(00000001.11000000, 0, False)
>>> Binary('0b01.110').lfill(8).rfill(8).string()
'00000001.11000000'

它有更多的辅助函数来操作二进制字符串,例如:shift、add、fill、to_exponential、invert...

PS: 无耻外挂,我是这个包的作者