位运算计算加减乘除

1)位运算加法:

int a=3,b=4;

while(b!=0){

  num=a^b;

  carry=a&b<<;

  a=num,b=carry;

}

最终a为结果

举个例子:

对于两数二进制相加,不进位相加相当于异或num,指考虑进位计算为与,并左移一位carry;当carry不为0时表示有进位,将进位的数carry不进位“加”到num中,得到新的num和carry;

a = 0011, b = 1001;
start;

first loop;
1.1 sum = 1010
1.2 carry = 0010
1.3 carry != 0 , go on;

// 递归写法
int add(int num1, int num2){
    if(num2 == 0)
        return num1;
    int sum = num1 ^ num2;
    int carry = (num1 & num2) << 1;
    return add(sum, carry);
}

// 迭代写法
int add(int num1, int num2){
    int sum = num1 ^ num2;
    int carry = (num1 & num2) << 1;  
    while(carry != 0){
        int a = sum;
        int b = carry;
        sum = a ^ b;
        carry = (a & b) << 1;  
    }
    return sum;
}

2)减法运算:

通过加法器来实现减法器,即首先实现一个加法器,设为add(int a,int b);

然后对两个数num1,num2,num1-num2=num1+(-num2);对于一个数的负数在计算机中时取反再加1,即m_num2=add(~num2,1);然后add(num1,m_num2);

/*
* num1: 减数
* num2: 被减数
*/
int substract(int num1, int num2){
    int subtractor = add(~num2, 1);// 先求减数的补码(取反加一)
    int result = add(num1, subtractor); // add()即上述加法运算  
    return result ;
}

3)乘法

https://www.jianshu.com/p/7bba031b11e7

猜你喜欢

转载自www.cnblogs.com/joelwang/p/10946423.html