Python - 将字符串应用二补码
我正在尝试将一个用字符串表示的二进制数字添加上二的补码。假设这个字符串已经被翻转过了,我该如何在最后一个字符上“加”1,并根据需要替换字符串中的其他字符呢?
举个例子:100010翻转成011101,并以字符串的形式表示。那我该如何对这个011101字符串应用二的补码呢?
让我感到困惑的一部分是,如果用户输入的二进制数字在应用二的补码时涉及到很多进位,那该怎么办呢?
3 个回答
1
如果你想不把它转换回数字,可以从字符串的右边开始,找到第一个1,然后把它左边的所有字符都翻转一下。
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
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