位运算实现四则运算

加法

十进制的加法运算
例子:5 + 17 = 22

  • 只做各位相加不进位,结果为 12(个位数 5 和 7 相加不进位是 2,十位数 0 和 1 相加结果为1);
  • 做进位,5 + 7 中有进位,进位的值是 10;
  • 把前面两个结果加起来, 12 + 10 的结果是 22,刚好 5 + 12 = 22;

二进制的加法运算
例子: 5 + 17 = 22(5 的二进制是 101,17 的二进制是 10001)

  • 各位相加不进位,结果是 10100;
  • 记下进位,只在最后一位相加时产生一个进位,结果是二进制的 10;
  • 把前两步的结果相加,结果是 10110,换算成十进制是 22;

位运算代替加法运算

  • 不考虑进位,对每一位相加。0 加 0 与 1 加 1 的结果都是 0, 0 和 1 与 1 和 0 的结果都是 1,这和异或的结果是一样的;
  • 进位,对 0 加 0、 0 加 1、 1 加0 而言,都不会产生进位i,只有 1 加 1时,会向前产生一个进位,把两个数做与运算,然后再向左移动一位;
  • 把两边步骤的结果相加,就相当于输入前两部的结果来递归调用自己;

代码

int AddWithoutArithmetic(int num1, int num2)
{
        if(num2 == 0)
                return num1;
 
        int sum = num1 ^ num2;
        int carry = (num1 & num2) << 1;
 
        return AddWithoutArithmetic(sum, carry);
}

减法

  • 减法相当于加法加上减数的相反数;
  • 二进制的相反数就是取反加 1;

代码

//减法:这个和加法一样了,首先取减数的补码,然后相加。 
int negative(int a)//取补码
{
    return add(~a,1);
}


int sub(int a,int b)
{
    return add(a,negative(b));
}

乘法

例子:a × b = ab

  • 各位上的数如果为 1,则加上 a,如果不为 1,则不加;
  • b 右移一位,a 左移一位;

代码

//正数乘法运算  
int Pos_Multiply(int a,int b)  
{  
    int ans = 0;  
    while(b)  
    {  
        if(b&1)  //b最后一位是否为1
            ans = Add(ans, a);  
        a = (a<<1);  
        b = (b>>1);  
    }  
    return ans;  
}

除法

除法就是由乘法的过程逆推,依次减掉(如果x够减的)y(231),y(230),...y8,y4,y2,y1。减掉相应数量的y就在结果加上相应的数量。
代码

//除法就是由乘法的过程逆推,依次减掉(如果x够减的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。  
int Pos_div(int x,int y)
{
    int ans=0;
    for(int i=31;i>=0;i--)
    {
        // //比较x是否大于y的(1<<i)次方,避免将x与(y<<i)比较,因为不确定y的(1<<i)次方是否溢出  
        if( (x>>i) >=y )
        {
            ans+=(1<<i);
            x-= (y<<i);
        }
    }
    return ans;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实...
    JxYoung阅读 42,013评论 22 90
  • 本文是对论文《The Z1: Architecture and Algorithms of Konrad Zuse...
    逸之阅读 4,427评论 15 12
  • 网站乱码问题我们会经常碰到,大多见于非英文的中文字符或其他字符乱码,而且,这类问题常常是因为编码方式问题,主要原因...
    波段顶底阅读 2,940评论 1 9
  • 1 关键字 1.1 关键字的概述 Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或...
    哈哈哎呦喂阅读 672评论 0 0
  • 像当年 把一个热突突的名字 刻在树上 桌子上 刻的无处不在 多少年了 我们还是喜欢把做不到的事 都写在墙上 没人想...
    查文瑾阅读 250评论 0 1