Python - 将字符串应用二补码

1 投票
3 回答
3394 浏览
提问于 2025-04-16 05:24

我正在尝试将一个用字符串表示的二进制数字添加上二的补码。假设这个字符串已经被翻转过了,我该如何在最后一个字符上“加”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

撰写回答