用位運算實現加法也就是計算機用二進制進行運算,32位的CPU只能表示32位內的數,這里先用1位數的加法來進行,在不考慮進位的基礎上,如下
很明顯這幾個表達式可以用位運算的“^”來代替,如下
?
?
這樣我們就完成了簡單的一位數加法,那么要進行二位的加法,這個方法可行不可行呢?肯定是不行的,矛盾就在于,如何去
獲取進位?要獲取進位我們可以如下思考:
?
?
//換個角度看就是這樣
?
?
正好,在位運算中,我們用“
?
?
到這里,我們基本上擁有了這樣兩個表達式
?
?
我們來做個2位數的加法,在不考慮進位的情況下
?
?
到這里基本上就得出結論了,其實后面的那個 “00” 已經不用再去計算了,因為第一個表達式就已經算出了結果。
繼續推理可以得出三位數的加法只需重復的計算三次得到第一個表達式的值就是計算出來的結果。
c代碼如下:
?
?
計算機本質是二進制運算,許多高人和天書都展示了如何用位運算來實現讓人糾結卻又驚奇的事情。在豆瓣上看到一篇日志描述如何用位運算實現乘法,其實問題解決的關鍵是如何用位運算實現加法。覺得原文敘述不夠精確,現總結如下。
定理1:設a,b為兩個二進制數,則a+b = a^b + (a&b) 證明:a^b是不考慮進位時加法結果。當二進制位同時為1時,才有進位,因此 (a&b) 定理2:使用定理1可以實現只用位運算進行加法運算。
證明:利用定理1中的等式不停對自身進行迭代。每迭代一次,進位補償右邊就多一位0,因此最多需要加數二進制位長度次迭代,進位補償就變為0,這時運算結束。
以上就是C語言用位運算實現加法運算的全部內容,更多內容請繼續關注武林技術頻道網站!
新聞熱點
疑難解答
圖片精選