位運算實現整數的加減乘數運算

2021-08-06 07:36:20 字數 2029 閱讀 1072

用位運算實現加法也就是計算機用二進位制進行運算,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。...