位運算實現整數加減乘除(計算機組成原理內容)

位運算的題目很多,這個就厲害了,轉載博客以學習編程之法。
聽同學百度二面中,不準用四則運算操作符來實現四則運算。一想就想到了計算機組成原理上學過的。位運算的思想可以應用到很多地方,這裏簡單的總結一下用位運算來實現整數的四則運算。
大佬帶你看位運算怎麼實現四則運算!
加法運算:
int AddWithoutArithmetic(int num1,int num2)
{
if(num2==0) return num1;//沒有進位的時候完成運算
int sum,carry;
sum=num1^num2;//完成第一步沒有進位的加法運算
carry=(num1&num2)<<1;//完成第二步進位並且左移運算
return AddWithoutArithmetic(sum,carry);//進行遞歸,相加
}
簡化一下:

[cpp] view plain copy
int Add(int a,int b)
{
return b ? Add(a^b,(a&b)<<1) : a;
/*if(b)
return Add(a^b,(a&b)<<1);
else
return a;*/
}
上面的思路就是先不計進位相加,然後再與進位相加,隨着遞歸,進位會變爲0,遞歸結束。

非遞歸的版本如下:

[cpp] view plain copy
int Add(int a, int b)
{
int ans;
while(b)
{ //直到沒有進位
ans = a^b; //不帶進位加法
b = ((a&b)<<1); //進位
a = ans;
}
return a;
}
減法運算:

[cpp] view plain copy
//這個和加法一樣了,首先取減數的補碼,然後相加。
int negtive(int a) //取補碼
{
return Add(~a, 1);
}
int Sub(int a, int b)
{
return Add(a, negtive(b));
}
正數乘法運算:

[cpp] view plain copy
//正數乘法運算
int Pos_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;
}
整數除法(正整數)

[cpp] view plain copy
//除法就是由乘法的過程逆推,依次減掉(如果x夠減的)y^(2^31),y^(2^30),…y^8,y^4,y^2,y^1。減掉相應數量的y就在結果加上相應的數量。
int Pos_Div(int x,int y)
{
int ans=0;
for(int i=31;i>=0;i–)
{
//比較x是否大於y的(1<

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章