定点二进制和返回 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: 无耻外挂,我是这个包的作者
我对 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: 无耻外挂,我是这个包的作者