位运算实现四则运算

加法

十进制的加法运算
例子: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) >=y )
        {
            ans+=(1<

你可能感兴趣的:(位运算实现四则运算)