用位運算實現加法也就是計算機用二進位制進行運算,32位的cpu只能表示32位內的數,這裡先用1位數的加法來進行,在不考慮進製的基礎上,如下1+
1= 01
+ 0= 1
0+ 1=
10+ 0
= 0很明顯這幾個表示式可以用位運算的「^」來代替,如下1^
1= 01
^ 0= 1
0^ 1=
10^ 0
= 0這樣我們就完成了簡單的一位數加法,那麼要進行二位的加法,這個方法可行不可行呢?肯定是不行的,矛盾就在於,如何去
獲取進製?要獲取進製我們可以如下思考:0+
0= 01
+ 0= 0
0+ 1=
01+ 1
= 1//換個角度看就是這樣0&
0= 不進製1&
0= 不進製0&
1= 不進製1&
1= 進製
正好,在位運算中,我們用「<<」表示向左移動一位,也就是「進製」。那麼我們就可以得到如下的表示式
//進製可以用如下表示:(x
&y)<<1
到這裡,我們基本上擁有了這樣兩個表示式x^
y//執行加法(x
&y)<<
1//進製操作
我們來做個2位數的加法,在不考慮進製的情況下11+
01= 1
00// 本來的演算法
// 用推算的表示式計算
11^
01= 10(
11& 01)
<< 1=
10//到這裡 我們用普通的加法去運算這兩個數的時候就可以得到 10 + 10 = 100
//但是我們不需要加法,所以要想別的方法,如果讓兩個數再按剛才的演算法計算一次呢
10^
10= 00(
10& 10)
<<
1= 100
到這裡基本上就得出結論了,其實後面的那個 「00」 已經不用再去計算了,因為第乙個表示式就已經算出了結果。
繼續推理可以得出三位數的加法只需重複的計算三次得到第乙個表示式的值就是計算出來的結果。
c**如下:
int add(int a,int b)
return jg;
}計算機本質是二進位制運算,許多高人和天書都展示了如何用位運算來實現讓人糾結卻又驚奇的事情。在豆瓣上看到一篇日誌描述如何用位運算實現乘法,其實問題解決的關鍵是如何用位運算實現加法。覺得原文敘述不夠精確,現總結如下。
定理1:設a,b為兩個二進位制數,則a+b = a^b + (a&b)<<1。
證明:a^b是不考慮進製時加法結果。當二進位制位同時為1時,才有進製,因此 (a&b)<<1是進製產生的值,稱為進製補償。將兩者相加便是完整加法結果。
定理2:使用定理1可以實現只用位運算進行加法運算。
證明:利用定理1中的等式不停對自身進行迭代。每迭代一次,進製補償右邊就多一位0,因此最多需要加數二進位制位長度次迭代,進製補償就變為0,這時運算結束。
不用算術運算子實現兩個數的加法 按位異或
對於二進位制的加法運算,若不考慮進製,則1 1 0,1 0 1,0 1 1,0 0 0,通過對比異或,不難發現,此方法與異或運算類似。因而排出進製,加法可用異或來實現。然後考慮進製,0 0進製為0,1 0進製為1,0 1進製為0,1 1進製為1,該操作與位運算的 操作相似。那麼加法運算可以這樣實現 ...
不用算術運算子實現兩個數的加法 按位異或
對於二進位制的加法運算,若不考慮進製,則1 1 0,1 0 1,0 1 1,0 0 0,通過對比異或,不難發現,此方法與異或運算類似。因而排出進製,加法可用異或來實現。然後考慮進製,0 0進製為0,1 0進製為1,0 1進製為0,1 1進製為1,該操作與位運算的 操作相似。那麼加法運算可以這樣實現 ...
不用算術運算子實現兩個數的加法 按位異或
對於二進位制的加法運算,若不考慮進製,則1 1 0,1 0 1,0 1 1,0 0 0,通過對比異或,不難發現,此方法與異或運算類似。因而排出進製,加法可用異或來實現。然後考慮進製,0 0進製為0,1 0進製為1,0 1進製為0,1 1進製為1,該操作與位運算的 操作相似。那麼加法運算可以這樣實現 ...