用位运算实现两个整数的加减乘除运算

来源:互联网 发布:淘宝话费怎样退款 编辑:程序博客网 时间:2024/05/21 07:56
位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。

1.整数的加法

  1. int MyAdd(int a,int b)    
  2. {    
  3.     for(int i=1;i;i<<=1)         
  4.         if(b&i)            
  5.             for(int j=i;j;j<<= 1)        
  6.                 if(a&j) a&=~j;    
  7.                 else {a|=j;break;}                          
  8.     return a ;    
  9. }    

我的思路主要是利用a+1的位运算就是最左端(从第0位开始向左)连续的1变为0,原先a中为0的位置最低那一位变为1。
在不同的位上加1,那就是从相应的位开始向左计算,右边不变。
下面还有一个网上的思路,我觉得这个更好:

  1. int AddWithoutArithmetic(int num1,int num2)    
  2. {    
  3.     if(num2==0) return num1;//没有进位的时候完成运算    
  4.     int sum,carry;    
  5.     sum=num1^num2;//完成第一步没有进位的加法运算    
  6.     carry=(num1&num2)<<1;//完成第二步进位并且左移运算    
  7.     return AddWithoutArithmetic(sum,carry);//进行递归,相加    
  8. }    

我简化一下:

  1. int Add(int a,int b) { b?return Add(a^b,(a&b)<<1):return a; }   

上面的思路就是先不计进位相加,然后再与进位相加,随着递归,进位会变为0,递归结束。

2.整数的减法
这个和加法一样了,首先取减数的补码,然后相加。

  1. int MyMinus(int a,int b)    
  2. {    
  3.     for(int i=1;i&&((b&i)==0);i<<=1);    
  4.     for(i<<=1;i;i<<=1) b^=i;    
  5.     return MyAdd(a,b);    
  6. }    

3.整数的乘法

乘法就是将乘数写成(2^0)*k0 + (2^1)*k1 + (2 ^2)*k2 + ... + (2^31)*k31,其中ki为0或1,然后利用位运算和加法就可以了。

  1. int MyMul(int a,int b)    
  2. {    
  3.     int ans=0;    
  4.     for(int i=1;i;i<<=1,a<<=1)    
  5.         if(b&i)    
  6.             ans+=a;    
  7.         return ans;    
  8. }   

4.整数除法(正整数)

除法就是由乘法的过程逆推,依次减掉(如果x够减的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。

  1. int MyDiv(int x,int y)    
  2. {    
  3.     int ans=0;    
  4.     for(int i=31;i>=0;i--)  
  5.     {    
  6.     //比较x是否大于y的(1<<i)次方,避免将x与(y<<i)比较,因为不确定y的(1<<i)次方是否溢出  
  7.         if((x>>i)>=y)           
  8.         {       
  9.             ans+=(1<<i);      
  10.             x-=(y<<i);        
  11.         }       
  12.     }    
  13.     return ans;    
  14. }    

原创粉丝点击