題目描述:
寫一個函數(shù),求兩個整數(shù)之和,要求在函數(shù)體內(nèi)不得使用+、-、*、/四則運算符號。
本豬豬看見題目是毫無頭緒的,故在此記錄一下大佬們清晰的解題思路(說實話看答案都看了好久才看懂),確實不熟悉二進制的按位運算,本題思路很典型,可以在多個場景下借鑒:
鏈接:https://www.nowcoder.com/questionTerminal/59ac416b4b944300b617d4f7f111b215
來源:??途W(wǎng)
首先看十進制是如何做的:5+7=12,三步走
第一步:相加各位的值,不算進位,得到2。
第二步:計算進位值,得到10. 如果這一步的進位值為0,那么第一步得到的值就是最終結(jié)果。
第三步:重復(fù)上述兩步,只是相加的值變成上述兩步的得到的結(jié)果2和10,得到12。
同樣我們可以用三步走的方式計算二進制值相加:5-101,7-111?
第一步:相加各位的值,不算進位,得到010,二進制每位相加就相當(dāng)于各位做異或操作,101^111。
第二步:計算進位值,得到1010,相當(dāng)于各位做與操作得到101,再向左移一位得到1010,(101&111)<<1。
第三步重復(fù)上述兩步, 各位相加010^1010=1000,進位值為100=(010&1010)<<1。? ??
繼續(xù)重復(fù)上述兩步:1000^100 = 1100,進位值為0,跳出循環(huán),1100為最終結(jié)果。
(好奇怪,一模一樣的邏輯,用python寫出來時間復(fù)雜度就超了)

知道了,主要原因還是因為python沒有無符號又移操作,所以需要越界檢查一波~

“~”為取反運算
其實關(guān)于二進制的原碼,補碼,反碼我一直沒有弄明白,還有python的無符號數(shù),越界檢查等等等,這一部分都沒看懂,先留坑,過段時間看明白了好好整理一次。