我試圖將二的補碼添加到用字符串表示的二進制數字中。 假設字符串已被翻轉,我將如何去「添加」1到最後一個字符,並根據需要替換字符串中的其他字符?Python - 將二的補碼應用於字符串
例如:100010被翻轉到011101,並被表示爲一個字符串。你會如何將這兩個補碼應用於011101字符串?
這真的讓我感到困惑的一部分是,如果用戶輸入一個二進制數,當應用二進制補碼時,涉及大量的攜帶。
我試圖將二的補碼添加到用字符串表示的二進制數字中。 假設字符串已被翻轉,我將如何去「添加」1到最後一個字符,並根據需要替換字符串中的其他字符?Python - 將二的補碼應用於字符串
例如:100010被翻轉到011101,並被表示爲一個字符串。你會如何將這兩個補碼應用於011101字符串?
這真的讓我感到困惑的一部分是,如果用戶輸入一個二進制數,當應用二進制補碼時,涉及大量的攜帶。
我只是將它作爲一個數字,然後將其轉換回來。
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。這會作弊並將中間補碼字符串值轉換爲一個整數以將其加1,然後使用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
當試圖使用「print twoscomp(<我翻轉的字符串>)時,我收到一個錯誤,說不能調用字符串。 – 2010-10-13 15:16:05
@匿名:對不起,我無法重現你描述的問題。你傳遞給'twoscomp()'作爲參數(即'<我的翻轉字符串>') – martineau 2010-10-13 16:03:43
@Anonymous:下面是一個在黑暗中拍攝,但我的胡亂猜測是,你可能已經創建了一個名爲字符串變量'斌',它隱藏了內建的'bin'函數,或者可能是'int'。更改你的變量名(也許是'bin_'),然後再給它一次。 – 2010-10-15 03:01:23
。
這是一件非常不切實際的事情 - 這是作業嗎? – 2010-10-13 05:13:32
從[你以前的問題](http://stackoverflow.com/questions/3920494/python-flipping-binary-1s-and-0s-in-a-string)的後續,大概。 – 2010-10-13 10:30:45
它是。我一直在努力工作好幾天沒有運氣。 – 2010-10-13 14:58:02