1、 不考慮進製的情況下位運算子中的異或^可以表示+號
2、 位運算子中的與運算子&和左移運算子《可以模擬加法中的進製
3、位運算不僅可以做加法,還可以做其它的乘法減法等:計算機本質是二進位制運算,許多高人和天書都展示了如何用位運算來實現讓人糾結卻又驚奇的事情。(所以位運算是可以實現加減乘除的)
用位運算實現加法也就是計算機用二進位制進行運算,32位的cpu只能表示32位內的數,這裡先用1位數的加法來進行,在不考慮進製的基礎上,如下
1 + 1 = 0
1 + 0 = 1
0 + 1 = 1
0 + 0 = 0
很明顯這幾個表示式可以用位運算的「 ^ 」來代替(不考慮進製的情況下位運算子中的異或^可以表示+號),如下
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
這樣我們就完成了簡單的一位數加法,那麼要進行二位的加法,這個方法可行不可行呢?肯定是不行的,矛盾就在於,如何去
獲取進製?要獲取進製我們可以如下思考:
0 + 0 = 0
1 + 0 = 0
0 + 1 = 0
1 + 1 = 1
//換個角度看就是這樣
0 & 0 = 不進製
1 & 0 = 不進製
0 & 1 = 不進製
1 & 1 = 進製
正好,在位運算中,我們用「<<」表示向左移動一位,也就是「進製」。那麼我們就可以得到如下的表示式
(x&y)<<1
到這裡,我們基本上擁有了這樣兩個表示式
x^y //執行加法
(x&y)<<1 //進製操作
我們來做個2位數的加法,在不考慮進製的情況下
11+01 = 100 // 本來的演算法
用推算的表示式計算
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;
}
計算機本質是二進位制運算,許多高人和天書都展示了如何用位運算來實現讓人糾結卻又驚奇的事情。在豆瓣上看到一篇日誌描述如何用位運算實現乘法,其實問題解決的關鍵是如何用位運算實現加法。覺得原文敘述不夠精確,現總結如下。 位運算 實現加法
用位運算實現加法也就是計算機用二進位制進行運算,32位的cpu只能表示32位內的數,這裡先用1位數的加法來進行,在不考慮進製的基礎上,如下 1 1 01 0 1 0 1 10 0 0很明顯這幾個表示式可以用位運算的 來代替,如下 1 1 01 0 1 0 1 10 0 0這樣我們就完成了簡單的一位數...
位運算 實現加法
用位運算實現加法也就是計算機用二進位制進行運算,32位的cpu只能表示32位內的數,這裡先用1位數的加法來進行,在不考慮進製的基礎上,如下1 1 01 0 1 0 1 10 0 0 很明顯這幾個表示式可以用位運算的 來代替,如下1 1 01 0 1 0 1 10 0 0這樣我們就完成了簡單的一位數加...
位運算實現加法
用位運算實現加法也就是計算機用二進位制進行運算,32位的cpu只能表示32位內的數,這裡先用1位數的加法來進行,在不考慮進製的基礎上,如下 1.1 1 0 2.1 0 1 3.0 1 1 4.0 0 0 很明顯這幾個表示式可以用位運算的 來代替,如下 1.1 1 0 2.1 0 1 3.0 1 1 ...