Python - 将两个补码应用于字符串

时间:2010-10-13 04:55:28

标签: python twos-complement

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

示例:100010被翻转为011101,并表示为字符串。你如何将两个补语应用于011101字符串?

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

只是为了变化,这里还有另一种方式,基于Two's Complement被定义为One's Complement加一。这会作弊并将中间一个补码字符串值转换为一个整数以向其中添加一个,然后使用 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

答案 2 :(得分:1)

如果你想在没有转换回数字的情况下这样做,从字符串的右边开始,直到找到第一个1,然后将所有字符翻转到左边。