【问题标题】:Python - Applying Two's Complement to a StringPython - 将二进制补码应用于字符串
【发布时间】:2010-10-13 04:55:27
【问题描述】:

我正在尝试将二进制补码添加到用字符串表示的二进制数中。 假设字符串已经被翻转,我将如何在最后一个字符上“添加”1,并根据需要替换字符串中的其他字符?

示例:100010 翻转为 011101,并表示为字符串。您如何将二进制补码应用于 011101 字符串?

其中真正让我感到困惑的部分是,如果用户输入一个二进制数,当应用二进制补码时,会涉及大量携带。

【问题讨论】:

  • 非常不切实际的事情——这是作业吗?
  • 大概是your previous question 的后续。
  • 是的。我已经为此工作了几天,但没有运气。

标签: python twos-complement


【解决方案1】:

我只是将它作为一个数字,然后将其转换回来。

def tobin(x, count=8):
    # robbed from http://code.activestate.com/recipes/219300/
    return "".join(map(lambda y:str((x>>y)&1), range(count-1, -1, -1)))

def twoscomp(num_str):
    return tobin(-int(num_str,2),len(num_str))

print twoscomp('01001001') # prints 10110111
print twoscomp('1000')     # prints 1000 (because two's comp is cool like that)
print twoscomp('001')      # prints 111

【讨论】:

    【解决方案2】:

    为了多样化,这里还有另一种方式,基于二进制补码被定义为一个补码加一这一事实。这有点作弊,将中间一个的补码字符串值转换为整数加一,然后使用 Python 2.6中添加的新内置 bin() 函数将其转换回二进制字符串>.

    def onescomp(binstr):
        return ''.join('1' if b=='0' else '0' for b in binstr)
    
    def twoscomp(binstr):
        return bin(int(onescomp(binstr),2)+1)[2:]
    
    print twoscomp('01001001') # prints 10110111
    print twoscomp('011101')   # prints 100011
    print twoscomp('001')      # prints 111
    

    【讨论】:

    • 在尝试使用“print twoscomp() 时,我收到一条错误消息,提示无法调用字符串。
    • @Anonymous:抱歉,我无法重现您描述的问题。您使用的是什么版本的 Python,以及您传递给twoscomp() 作为参数的具体内容(即<my flipped string>)?
    • @Anonymous:这是在黑暗中拍摄的,但我猜测您可能已经创建了一个名为bin 的字符串变量,它隐藏了内置的bin 函数。那个,或者可能是int。更改您的变量名称(可能更改为 bin_),然后再试一次。
    【解决方案3】:

    如果您不想转换回数字,请从字符串的右侧开始,直到找到第一个 1,然后将所有字符翻转到左侧。

    【讨论】:

      猜你喜欢
      • 2016-07-16
      • 1970-01-01
      • 2016-08-31
      • 2020-03-05
      • 2014-03-19
      • 2015-04-19
      • 2021-11-09
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多