这篇文章上次修改于 990 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

一、位运算

p    q       p & q    p | q    p ^ q   
0    0        0        0        0
0    1        0        1        1
1    1        1        1        0
1    0        0        1        1

二、位运算实现加法

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

三、位运算实现减法

在进行位运算实现减法的过程中,首先应该注意到取反运算中的一个很重要的特点,即~b = -(b+1)。根据这个特点,我们可以很简单的利用位运算求得一个数的相反数,即利用Add(~b, 1)。而由于整数的减法实际上就是加法的逆运算,即a-b = a+(-b)。

int Minus(int a, int b){
    return Add(a, Add(~b, 1));
}

四、位运算实现乘法

这里我们首先进行绝对值的运算,再通过a^b是否小于0判断符号的异同性。

int Multiply(int a, int b){
    int a1 = a > 0 ? a : Add(~a, 1);
    int b1 = b > 0 ? b : Add(~b, 1);
    int sum = 0;
    while(b1){
        if(b1 & 0x1){
            sum = Add(sum, a1);
        }
        a1 = a1 << 1;
        b1 = b1 >> 1;
    }
    if((a ^ b) < 0)
        return Add(~sum, 1);
    else return sum;
}

五、位运算实现除法

跟加法、减法一样,除法是乘法的逆运算,那么除法就是做有限次的减法,直到被减数小于减数为止。这种思路类似于乘法中的简单思路,问题同样是在被除数远大于除数时,需要做多次除法。
改良的除法思路如下,考虑到int型整数占32位,那么用i = 31开始比较被除数与除数的2i的大小,若被除数大,则在商处直接加上i从而减小减法的次数。

int Divide(int a, int b){   
    int quotient = 0;
    if(!b){
        cout << "Error" << endl;
        return 1;
    }
    for(int i = 31; i --; i > 0){
        if((a >> i) >= b)
        {
            quotient = Add(quotient, 1 << i);
            a = Minus(a, b << i);
        }
    }
    if((a ^ b) < 0)
        quotient = Add(~quotient, 1);
    return quotient;
}

————————————————
参考原文链接:https://blog.csdn.net/qq_41716838/article/details/92193515