定点二进制和反Python

时间:2018-08-17 04:31:18

标签: python fixed-point

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

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

示例1.25-> 00000001.01000000

操纵第一小数部分(0-> 1)

00000001.11000000-> 1.75

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

如果小数部分中有N位,则只需除以2 N ,因为存储的位模式实际上是实际值乘以2 N 。因此,对于Q8.8,例如您的情况,您必须除以256

对于上面的00000001.01000000和00000001.11000000示例:

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

答案 1 :(得分:0)

您可以使用 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'

现在,您可以应用“或”掩码对0进行1位有效:

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

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

退出:

'00000001.11000000'
1.75

答案 2 :(得分:0)

numfi 可以将浮点数转换为具有特定字/小数长度的定点数,但不能直接操作二进制位。

您可以使用像和/或/异或这样的按位逻辑运算来修改位作为解决方法,对于计算量大的程序,按位运算应该比字符串求值快

>>> 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')

答案 3 :(得分:0)

您可以使用 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:无耻的插件,我是这个包的作者。