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


    解决方案

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

    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;
    }
    复制代码
  • 相关阅读:
    Wamp 扩展Oracle Oci
    Yii 网站上线不需手动配置
    Centos 设置时区
    Crontab 入门
    centos apache安装oracle扩展
    Centos rpm 卸载
    mac vagrant 虚拟机nfs挂载点
    搭建php虚拟环境
    Mac 安装package control
    Sublime 安装、删除插件
  • 原文地址:https://www.cnblogs.com/alantu2018/p/8460878.html
Copyright © 2020-2023  润新知