位操作實現加減乘除四則運算
阿新 • • 發佈:2018-02-23
tle 參與 nbsp pre 圖片 操作數 整數 spa 或操作
解決方案
需要熟練掌握一些常見的位操作實現,具體為:
1)常用的等式:-n=~(n-1)=~n+1
2)獲取整數n的二進制中最後一個1:n&(-n)或者n&~(n-1)如:n=010100,則-n=101100,n&(-n)=000100
3)去掉整數n的二進制中最後一個1:n&(n-1),如:n=010100,n-1=010011,n&(n-1)=010000
1 利用位運算實現加法
由於我們不能使用任何算術運算符,因此可供我們使用的就只有位運算符了。 於是我們把操作數看成二進制表示,然後對它們做類似的操作:
- 不考慮進位的按位求和,(0,0),(1,1)得0,(1,0),(0,1)得1, 使用異或操作可以滿足要求。
- 只考慮進位,只有(1,1)才會產生進位,使用按位與可以滿足要求。 當前位產生進位,要參與高一位的運算,因此按位與後要向左移動一位。
- 遞歸求和,直到進位為0
實現代碼:
int add(int a,int b)
{
int carry,add;
do{
add=a^b;
carry=(a&b)<<1;
a=add;
b=carry;
}while(carry!=0);
return add;
}
2 減法實現
減法和容易地轉換為加法:a-b=a+(-b)=a+(~b+1)
int subtract(int a,int b)
{
return add(a,add(~b,1));
}
3 乘法實現
乘法的實現可以轉換成:k31*(2^31)+k30*(2^30)+...+k2*(2^2)+k1*(x^1)+k0*(x^0);其中k0~k31取0或者1
//正整數的乘法
int multiply(int a,int b)
{
int ans=0;
while(b)
{
if(b&1)
ans=add(ans,a);
a=a<<1;
b=b>>1;
}
return ans;
}
4 除法實現
int divide(int a,int b)
{
int count=0;
while(a>=b)
{
a=subtract(a,b);
count=add(count,1);
}
return count;
}
改進的除法:
int div(const int x,const int y)
{
int left_num=x;
int result=0;
while(left_num>=y)
{
int multi=1;
while(y*multi<=(left_num>>1))
{
multi=multi<<1;
}
result+=multi;
left_num-=y*multi;
}
return result;
}
位操作實現加減乘除四則運算