基本的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。...