位操作实现加减乘除四则运算

Posted AlanTu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位操作实现加减乘除四则运算相关的知识,希望对你有一定的参考价值。

解决方案

需要熟练掌握一些常见的位操作实现,具体为:

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 利用位运算实现加法

由于我们不能使用任何算术运算符,因此可供我们使用的就只有位运算符了。 于是我们把操作数看成二进制表示,然后对它们做类似的操作:

  1. 不考虑进位的按位求和,(0,0),(1,1)得0,(1,0),(0,1)得1, 使用异或操作可以满足要求。
  2. 只考虑进位,只有(1,1)才会产生进位,使用按位与可以满足要求。 当前位产生进位,要参与高一位的运算,因此按位与后要向左移动一位。
  3. 递归求和,直到进位为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;
}
技术分享图片

以上是关于位操作实现加减乘除四则运算的主要内容,如果未能解决你的问题,请参考以下文章

java用位运算实现加减乘除

加减乘除求余 利用 位运算实现(详细)

位运算的奇技淫巧:实现乘除交换两数判断奇偶交换符号求绝对值高低位交换二进制逆序统计二进制中 1 的个数

位运算-实现加减乘除

[算法]位运算问题之三(实现加减乘除)

用位运算实现四则运算之加减乘除(用位运算求一个数的1/3) via Hackbuteer1