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