我正在尝试将二进制补码添加到用字符串表示的二进制数中。假设字符串已经被翻转,我将如何将“添加”1 到最后一个字符,并根据需要替换字符串中的其他字符?
示例:100010 翻转为 011101,并表示为字符串。您如何将二进制补码应用于 011101 字符串?
真正让我感到困惑的一部分是,如果用户输入一个二进制数,当应用二进制补码时,会涉及很多携带。
我正在尝试将二进制补码添加到用字符串表示的二进制数中。假设字符串已经被翻转,我将如何将“添加”1 到最后一个字符,并根据需要替换字符串中的其他字符?
示例:100010 翻转为 011101,并表示为字符串。您如何将二进制补码应用于 011101 字符串?
真正让我感到困惑的一部分是,如果用户输入一个二进制数,当应用二进制补码时,会涉及很多携带。
只是为了多样化,这里还有另一种方式,基于二进制补码被定义为一个补码加一这一事实。这有点作弊,将中间一个的补码字符串值转换为整数以将其加一,然后使用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
我只是将其作为数字进行,然后将其转换回来。
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
if you want to do it without converting back to a number, start from the right of the string until you find the first 1, then flip all chars to its left.