2010-10-13 35 views
1

我試圖將二的補碼添加到用字符串表示的二進制數字中。 假設字符串已被翻轉,我將如何去「添加」1到最後一個字符,並根據需要替換字符串中的其他字符?Python - 將二的補碼應用於字符串

例如:100010被翻轉到011101,並被表示爲一個字符串。你會如何將這兩個補碼應用於011101字符串?

這真的讓我感到困惑的一部分是,如果用戶輸入一個二進制數,當應用二進制補碼時,涉及大量的攜帶。

+2

這是一件非常不切實際的事情 - 這是作業嗎? – 2010-10-13 05:13:32

+0

從[你以前的問題](http://stackoverflow.com/questions/3920494/python-flipping-binary-1s-and-0s-in-a-string)的後續,大概。 – 2010-10-13 10:30:45

+0

它是。我一直在努力工作好幾天沒有運氣。 – 2010-10-13 14:58:02

回答

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,然後使用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 
+0

當試圖使用「print twoscomp(<我翻轉的字符串>)時,我收到一個錯誤,說不能調用字符串。 – 2010-10-13 15:16:05

+0

@匿名:對不起,我無法重現你描述的問題。你傳遞給'twoscomp()'作爲參數(即'<我的翻轉字符串>') – martineau 2010-10-13 16:03:43

+0

@Anonymous:下面是一個在黑暗中拍攝,但我的胡亂猜測是,你可能已經創建了一個名爲字符串變量'斌',它隱藏了內建的'bin'函數,或者可能是'int'。更改你的變量名(也許是'bin_'),然後再給它一次。 – 2010-10-15 03:01:23

1
,如果你想這樣做,無需轉換回數字,直到找到第1從字符串的右邊開始,然後翻轉所有字符在它的左邊

相關問題