用位運算實現加法也就是計算機用二進位制進行運算,32位的cpu只能表示32位內的數,這裡先用1位數的加法來進行,在不考慮進製的基礎上,如下1+
1= 01
+ 0= 1
0+ 1=
10+ 0
= 0很明顯這幾個表示式可以用位運算的「^」來代替,如下
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 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)
<
10//到這裡 我們用普通的加法去運算這兩個數的時候就可以得到 10 + 10 = 100
//但是我們不需要加法,所以要想別的方法,如果讓兩個數再按剛才的演算法計算一次呢
10^
10= 00(
10& 10)
<
1= 100
到這裡基本上就得出結論了,其實後面的那個 「00」 已經不用再去計算了,因為第乙個表示式就已經算出了結果。
繼續推理,直至進製補償為0。
/**
* 兩個正整數相加
* * @param a
* @param b
* @return
*/public static int aplusb(int a, int b)
return xor; }
/*** 兩個正整數相加的遞迴演算法
*/public static int aplusbpro(int a,int b)
return aplusbpro(a^b,(a&b)<<1); }
/*** 實現整數的相乘
*/public static int amultibpro(int a,int b)
return sum; }
/*** 遞迴實現整數相乘
*/public static int amultib(int a,int b)
測試發現:基本的算數運算在計算機底層其實就是通過位運算完成的,因此位運算實現的基本運算的效率和運算子等同
例如加法運算
乘法運算,在計算機底層會對被乘數,乘數做優化。當乘數大於被乘數時,會交替兩者的位置,以減少運算次數,提公升運算速度
優化前:
優化後
用位運算實現整數的加減乘除運算
基本的c 位運算子有 與 或 取反 異或 右移 左移 等,眾所周知,採用位運算可以極大的提高 的執行效率。如果有的程式需要處理海量資料,其中又涉及大量簡單的加減乘除運算,則可以用位運算來進行操作,減少程式的執行時間。例如,a int a 5,b b a 3 cout b 即b a 3等價於b a 8...
用位運算實現兩個整數的加減乘除運算
位運算的思想可以應用到很多地方,這裡簡單的總結一下用位運算來實現整數的四則運算。整數加法 int add int a,int b return a 我的思路主要是利用a 1的位運算就是最左端 從第0位開始向左 連續的1變為0,原先a中為0的位置最低那一位變為1。在不同的位上加1,那就是從相應的位開始...
用位運算實現兩個整數的加減乘除運算
位運算的思想可以應用到很多地方,這裡簡單的總結一下用位運算來實現整數的四則運算。1.整數加法 cpp view plain copy intadd inta,intb return a 我的思路主要是利用a 1的位運算就是最左端 從第0位開始向左 連續的1變為0,原先a中為0的位置最低那一位變為1。...