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

位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。

1.整数加法

[cpp]  view plain copy
  1. int Add(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,那就是从相应的位开始向左计算,右边不变。
下面还有一个网上的思路,我觉得这个更好:

[cpp]  view plain copy
  1. int Add(int a,int b)    
  2. {    
  3.     if(b == 0) return a;//没有进位的时候完成运算    
  4.     int sum,carry;    
  5.     sum = a ^ b;//完成第一步没有进位的加法运算    
  6.     carry=(a & b) << 1;//完成第二步进位并且左移运算    
  7.     return Add(sum,carry);//进行递归,相加    
  8. }    
我简化一下:

[cpp]  view plain copy
  1. int Add(int a,int b) { return b ?  Add(a ^ b,(a & b) <<1 ): a; }   
上面的思路就是先不计进位相加,然后再与进位相加,随着递归,进位会变为0,递归结束。

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

[cpp]  view plain copy
  1. int Minus(int a,int b)    
  2. {    
  3.     for(int i = 1; i && ((b & i) ==0 ); i <<= 1)  
  4.         ;    
  5.     for(int i <<= 1; i; i <<=1 )   
  6.         b ^= i;    
  7.     return Add(a,b);    
  8. }    

3.整数乘法

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

[cpp]  view plain copy
  1. int Mul(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.整数除法

除法就是由乘法的过程逆推,依次减掉(如果够减的话)divisor << 31、divisor << 30、... 、divisor << 2、divisor << 1、divisor(要保证不能溢出)减掉相应数量的除数就在结果加上相应的数量。

[cpp]  view plain copy
  1. int Div(int dividend, int divisor)   
  2. {  
  3.     // assert(divisor != 0)  
  4.     int sign = 1;  
  5.     if(dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0)  
  6.         sign = -1;  
  7.     unsigned int x = (unsigned int)abs(dividend);  
  8.     unsigned int y = (unsigned int)abs(divisor);  
  9.     int bitCnt = sizeof(int) << 3;  
  10.     int quotient = 0;  
  11.     int k = bitCnt-1;  
  12.     while(((1 << k) & y) == 0) k--;  
  13.     for(int j = bitCnt-1-k; j >= 0; j--)  
  14.     {  
  15.         if(x >= (y << j))  
  16.         {  
  17.             x -= (y << j);  
  18.             quotient += (1 << j);  
  19.         }  
  20.     }  
  21.     return sign*quotient;  
  22. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值