【问题标题】:Patterns in Binary Fractions with PythonPython 中的二进制分数模式
【发布时间】:2015-02-16 01:50:02
【问题描述】:

研究模式识别需要识别有理数分数二进制表示中的重复模式。 bin(2**24/n) 去除前导零,例如bin(2**24/11) -> 0b101110100010111010001 而不是 0b000101110100010111010001。前导零的数量当然是可变的。这里明显的模式是 0001011101...

我是一个 nubee,Python 仍在学习曲线上。有没有适合 Python 的方法来解决这个问题?

【问题讨论】:

  • 嗯? bin(2**24/3) 在 Python 2.x 上是 0b10101010101010101010101,在 Python 3.x 上是错误
  • 您的解决方案是否需要使用 Python?如果没有,我可以推荐其他几种方法来做到这一点。顺便说一句,2^24/3 = 10101010101010101010101.(01),其中 (01) 表示 01 永远重复。

标签: python binary numbers


【解决方案1】:

这可以通过字符串格式化来完成,在 2.6+ 中:

>>> '{0:024b}'.format(23)
'000000000000000000010111'

【讨论】:

    【解决方案2】:

    如果您有比字符串格式所能提供的更高级的需求,您可能会发现bitstring 模块很有用。

    >>> from bitstring import BitArray
    >>> a = BitArray(24)          # 24 zero bits
    >>> a.uint = 2**24/11         # set the unsigned integer propery
    >>> a.bin                     # get the binary propery
    '000101110100010111010001'
    

    它永远不会切断前导零位,并且可以做一些其他有用的技巧

    >>> a.uint /= 2
    >>> a.bin
    '000010111010001011101000'
    >>> list(a.findall('0b1011'))
    [4, 14]
    >>> a *= 2     # concatenation
    >>> a.bin
    '000010111010001011101000000010111010001011101000'
    >>> a.replace('0b00001', '0xe')
    2              # 2 replacements made
    >>> a.bin
    '1110011101000101110100011100111010001011101000'
    

    我不确定您的确切需求是什么,所以所有这些都可能是多余的,而且您可能不想在任何情况下使用外部库,但是 Python 对位数组的内置支持有点基本。

    【讨论】:

    • 这看起来很糟糕。我的方法更简单,但不是通用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2016-11-10
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多