您的位置:首页 > 其它

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

2015-05-26 14:58 288 查看
原文地址:http://blog.csdn.net/luckyxiaoqiang/article/details/6886489

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

1.整数加法

[cpp] view
plaincopy

int Add(int a,int b)    

{    

    for(int i = 1; i; i <<= 1)         

        if(b & i)            

            for(int j = i; j; j <<= 1)        

                if(a & j) a &= ~j;    

                else {a |= j; break;}                          

    return a ;    

}    

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

[cpp] view
plaincopy

int Add(int a,int b)    

{    

    if(b == 0) return a;//没有进位的时候完成运算    

    int sum,carry;    

    sum = a ^ b;//完成第一步没有进位的加法运算    

    carry=(a & b) << 1;//完成第二步进位并且左移运算    

    return Add(sum,carry);//进行递归,相加    

}    

我简化一下:

[cpp] view
plaincopy

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

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

2.整数减法

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

[cpp] view
plaincopy

int Minus(int a,int b)    

{    

    for(int i = 1; i && ((b & i) ==0 ); i <<= 1)  

        ;    

    for(int i <<= 1; i; i <<=1 )   

        b ^= i;    

    return Add(a,b);    

}    

3.整数乘法

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

[cpp] view
plaincopy

int Mul(int a,int b)    

{    

    int ans = 0;    

    for(int i = 1; i; i <<= 1, a <<= 1)    

        if(b & i)    

            ans += a;    

        return ans;    

}   

4.整数除法

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

[cpp] view
plaincopy

int Div(int dividend, int divisor)   

{  

    // assert(divisor != 0)  

    int sign = 1;  

    if(dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0)  

        sign = -1;  

    unsigned int x = (unsigned int)abs(dividend);  

    unsigned int y = (unsigned int)abs(divisor);  

    int bitCnt = sizeof(int) << 3;  

    int quotient = 0;  

    int k = bitCnt-1;  

    while(((1 << k) & y) == 0) k--;  

    for(int j = bitCnt-1-k; j >= 0; j--)  

    {  

        if(x >= (y << j))  

        {  

            x -= (y << j);  

            quotient += (1 << j);  

        }  

    }  

    return sign*quotient;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  位运算