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

2021-06-19 04:27:10 字數 2623 閱讀 3971

基本的c++位運算子有:&(與)、|(或)、

~(取反)、^(異或)、>>(右移)、<<(左移)等,

眾所周知,採用位運算可以極大的提高**的執行效率。如果有的程式需要處理海量資料,其中又涉及大量簡單的加減乘除運算,則可以用位運算來進行操作,減少程式的執行時間。

例如,a<

int a=5,b;

b=a<<3;

cout<<"b="<

即b=a<<3等價於b=a*8。由此看來,對於乙個數a乘以乙個數b,若b能夠表示成2的n次方的形式,只要採用左移運算即可(但是值得注意的是,要避免溢位!)。

這裡有個問題,那就是如果乘數不是2的n次方的形式該怎麼辦?解決的方法其實很簡單,只要將所要乘的數分解為幾個2的n次方相加的形式即可。例如,計算b=a*20,因為20等於2的4次方加2的2次方,所以b=a*20等價於如下的位運算表示式:b=(a<<4)+(a<<2)。

那麼,如果乘數是負數時又該怎麼辦呢?因為負數在計算機中的儲存方式為補碼的形式,所以對任意的整數,如下的等式:(~a)+a+1=0恆成立。公式中用到了

普通的加法運算,細心的人可能會發現,上面的表示式b=(a<<4)+(a<<2)中也用到了加法運算,那麼如何將加法運算也變為位運算呢?下面我們首先來看一下如何用位運算實現加法運算。

加法運算是所有四則運算的基礎,只要能實現加法運算,即可實現其他運算。顯然的,異或運算得出的是兩個數的不計進製和,與運算的結果左移一位剛好得出的是進製,所以,加法可以採用如下方式運算:

int add(int a,int b)

return result;

}

有了加法的位運算,那麼減法可通過轉換變為加法來運算,因為a-b=a+(-b)=a+(~b)+1,所以,減法運算可以採用如下方式計算:

int sub(int a,int b)

回到乘法運算的問題,當第二個乘數是正整數時,由上面的分析,採用如下的方式計算即可:

int mul(int a,int b)

return result;

}

當第二個乘數是負數時,只需將上面的程式修改如下即可:

int mul(int a,int b)

while(b)

if(flag)

return add(~result,1);

return result;

}

對於除法運算,可將除法看作乘法的逆過程,對於32位的int型別數,可從最高位(第31位)開始,依次比較被除數a與2的n次方的關係,若x>2的n次方,則x減去2的n次方,當比較到最低位(第0位)後,即可得到結果。如果再將除數小於0的情況考慮進去,那麼可得到如下的計算方式:

int div(int a,int b)

return result;

}/**用位運算實現整數的減運算*/

int sub(int a,int b)

/**用位運算實現整數的乘運算*/

int mul(int a,int b)

while(b)

if(flag)

return add(~result,1);

return result;

}/**用位運算實現整數的除運算*/

int div(int a,int b)

{ if(b)

{int result=0,flag=0;

if((a^b)&0x8000)

flag=1;

if(a&0x8000)

a=add(~a,1);

if(b&0x8000)

b=add(~b,1);

for(int i=31; i>=0; i=sub(i,1))

if((a>>i)>=b)

{result=add(result,1《輸出結果為:

***位運算加法測試***

a = 17   b = 5   a + b = 22

a = 17   b = -5   a + b = 12

a = -17   b = 5   a + b = -12

a = -17   b = -5   a + b = -22

***位運算減法測試***

a = 17   b = 5   a - b = 12

a = 17   b = -5   a - b = 22

a = -17   b = 5   a - b = -22

a = -17   b = -5   a - b = -12

***位運算乘法測試***

a = 17   b = 5   a * b = 85

a = 17   b = -5   a * b = -85

a = -17   b = 5   a * b = -85

a = -17   b = -5   a * b = 85

***位運算除法測試***

a = 17   b = 5   a / b = 3

a = 17   b = -5   a / b = -3

a = -17   b = 5   a / b = -3

a = -17   b = -5   a / b = 3

位運算實現加減乘除

include include 加法運算 int add int a,int b 補碼中正數轉負數的原理 int negative int a 減法運算 int sub int a,int b 判斷正負 bool isnegative int a 僅計算正數乘法 int multi help int...

位運算實現加減乘除

關於邏輯右移和算術右移 vs中,對於unsigned型別,是邏輯右移,對於signed,算術右移 加法器的實現 對於不考慮進製的加法 0 0 0 1 0 1 0 1 1 1 1 0 即是異或運算 考慮進製 0 0 1 0 0 0 1 0 1 1 1 即是與運算 以下程式,a即不考慮進製部分,b為進製...

位運算實現加減乘除

位運算的思想可以應用到很多地方,這裡簡單的總結一下用位運算來實現整數的四則運算。1.整數加法 cpp view plain copy intadd inta,intb return a 我的思路主要是利用a 1的位運算就是最左端 從第0位開始向左 連續的1變為0,原先a中為0的位置最低那一位變為1。...