文字列で表される 2 進数に 2 の補数を加算しようとしています。文字列が既に反転されていると仮定すると、最後の文字に 1 を「追加」し、必要に応じて文字列内の他の文字を置き換えるにはどうすればよいでしょうか?
例: 100010 は 011101 に反転され、文字列として表されます。2 の補数を 011101 文字列にどのように適用しますか?
この中で私が本当に困惑したのは、ユーザーが 2 の補数を適用するときに多くの桁上げを伴う 2 進数を入力した場合です。
文字列で表される 2 進数に 2 の補数を加算しようとしています。文字列が既に反転されていると仮定すると、最後の文字に 1 を「追加」し、必要に応じて文字列内の他の文字を置き換えるにはどうすればよいでしょうか?
例: 100010 は 011101 に反転され、文字列として表されます。2 の補数を 011101 文字列にどのように適用しますか?
この中で私が本当に困惑したのは、ユーザーが 2 の補数を適用するときに多くの桁上げを伴う 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 の補数が 1 の補数 + 1 として定義されるという事実に基づいたさらに別の方法を次に示します。これは少しごまかし、中間の 1 の補数文字列値を整数に変換して 1 を加え、次にPython 2.6bin()で追加された新しい組み込み関数を使用してバイナリ文字列に変換します。
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
数値に変換せずにそれを行いたい場合は、最初の 1 が見つかるまで文字列の右側から開始し、すべての文字を左側に反転します。