我对python还是很陌生,有没有一种快速的方法可以将十进制转换为16位定点二进制(1位符号7位整数8位分数)并返回python。
我想操纵二进制并将该操纵的二进制转换回十进制。
示例1.25-> 00000001.01000000
操纵第一小数部分(0-> 1)
00000001.11000000-> 1.75
非常感谢您的帮助。
答案 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:无耻的插件,我是这个包的作者。