2016-08-24 19 views
5

我想解決一個問題,即有關編寫用於添加兩個整數而不使用'+'或' - '運算符的Python代碼。我有以下的代碼,完全適用於兩個正數:使用Python中的按位運算添加兩個整數時無限循環3

def getSum(self, a, b): 

    while (a & b): 
     x = a & b 
     y = a^b 
     a = x << 1 
     b = y 

    return a^b 

這段代碼完全適用,如果輸入的是兩個正整數或兩個負整數,但是當一個數是正的,另一種是消極失敗。它進入無限循環。任何想法爲什麼這可能會發生?

+0

你在使用'a'和'b'的哪個測試值?在循環過程中打印或觀察'a'和'b'的值 - 它們是否屬於重複模式?另外,a'或'b'是否定操作數是否有區別? – cxw

回答

6

Python 3有arbitrary-precision integers ("bignums")。這意味着,隨時x是負數,x << 1將使x負兩倍的數量級。從右側移入的零將會推動數量越來越大。

在二進制補碼中,正數在最高位中有0,負數在最高位中有1。這意味着,當ab中只有一個爲負數時,ab的最高位將有所不同。因此,x將爲正數(1 & 0 = 0),而y將爲負數(1^0 = 1)。因此,新的a將爲正數(x<<1),而新的b將爲負數(y)。

現在:任意精度負整數實際上具有無限數量的前導1位,至少是數學上的。所以a是一個更大和更大的正數,每次迭代擴大2。 b越來越領先1位添加到能夠執行按位&^a。因此,無論a的哪些位與的1位中的一個相匹配,所以a & b總是爲真,因此該循環永遠運行。

+0

感謝您的解釋。這正是我打印數字時發生的情況。 – Mowgli

+0

你會建議這個代碼來處理這個邊緣情況? – Mowgli

+0

@Mowgli啊!這是完全不同的問題:)。但是,嚴重的是,我建議你發佈一個新的問題,鏈接到這個問題,並問「如何解決」。我從來沒有見過任何人抱怨這樣做。 SO值緊緊圍繞着問題,誰知道?別人可能會有比我想出的更好的解決方法。在這裏發表評論的鏈接,我會看看它。 – cxw

1

我猜這是一個家庭作業問題,所以我不想給你一個可行的功能---你可以通過努力學習更多的東西。

該問題源於存儲負整數的方式。爲了說明的目的,讓我們假裝你正在處理4位有符號整數(而不是32位有符號整數或其他)。數字+1是0001.數字-1是1111.您應該能夠用筆和紙坐下來,並使用這兩個數字手動運行您的功能。答案當然應該是0000,但我認爲你會通過用筆和紙來處理這個簡化的案例來發現你的代碼出了什麼問題。

+0

歡迎來到該網站,並感謝您的回答!我同意,邊做邊學是最好的。在線時,請查看[tour](https://stackoverflow.com/tour)瞭解更多關於可能收到upvotes的答案的內容。請享用! – cxw

+0

謝謝你回答kloppen。我從來不想要工作代碼。我只是想了解發生了什麼。這不是一個家庭作業問題。 :) – Mowgli