【问题标题】:Fixed point binary and back python定点二进制和返回python
【发布时间】:2018-08-17 04:31:17
【问题描述】:

我是 python 的新手,有没有一种快速的方法可以将十进制转换为 16 位定点二进制(1 位符号 - 7 位整数 - 8 位小数)并返回到 python。

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

例如1.25 -> 00000001.01000000

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

00000001.11000000 -> 1.75

非常感谢任何帮助。

【问题讨论】:

    标签: python fixed-point


    【解决方案1】:

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

    对于上面的 00000001.01000000 和 00000001.11000000 示例:

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

    【讨论】:

    • 非常感谢@phuclv。你能帮我如何将 1.25 转换为 0b0000000101000000
    • @AbhinavGeorge 乘以 256,就像我上面说的那样
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以使用 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 掩码来执行 0 位 val 到 1

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

      出来:

      '00000001.11000000'
      1.75

      【讨论】:

        【解决方案4】:

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

        您可以使用和/或/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')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-24
          • 2017-11-07
          • 2016-12-25
          • 1970-01-01
          • 1970-01-01
          • 2011-11-20
          • 2017-03-14
          • 1970-01-01
          相关资源
          最近更新 更多