在看《劍指Offer》過程中,面試題47不用加減乘除做加法,給出的思路是使用二進制的異或以及與運算,總之就是使用二進制。但是在使用Python實現的過程中,對於正整數是沒有問題的,但是對於負數,會出現死循環情況。這是為什么呢?因為在Python中,對於超出32位的大整數,會自動進行大整數的轉變,這就導致了在右移位過程中,不會出現移到了0的情況,也就會造成了死循環。
這里需要了解的是Python中整數實現的原理以及二進制中的移位等原理。
已經知道了右移過程中大整數的自動轉化,導致變不成0,那么只需要在移動的過程中加一下判斷就行了,把craay的值和0xFFFFFFFF做一下比較就可以了,具體代碼如下所示。
1 def bit_add(n1, n2): 2 carry = 1 3 while carry: 4 s = n1 ^ n2 5 carry = 0xFFFFFFFF & ((n1 & n2) << 1) 6 carry = -(~(carry - 1) & 0xFFFFFFFF) if carry > 0x7FFFFFFF else carry 7 n1 = s 8 n2 = carry 9 return n1
其實在Python中,可以直接使用內置函數sum求和,不過我感覺sum源碼中會用到+?不確定,需要看源碼才行。
1 def add(n1, n2): 2 return sum([n1, n2])