两个数相加相减(位移)

2个数相加,不出现加法符号,通过位移模拟加法来操作

转变思路,下面是2进制思维的 1+3

0001
0011
--------
0100


只对2个数进行异或(^)操作

0001 ^
0011
--------
0010

从上面我们可以看出,异或操作跟实际加法操作很像,只是没有算上进位(carry)


只对2个数进行与(&)操作

0001 &
0011
--------
0001

从上面我们可以看出,设置位都是需要进位的,但是进位需要往左移动一位即

0001 << 1 = 0010


最后得出这样一个公式

x + y = ((x&y) << 1) + (x ^ y)


linux c例子

#include <stdio.h>

int bin_add(int x, int y)
{
    int carry;

    while (x && y) {
        carry = x & y;
        x = x ^ y;
        y = carry << 1;
    }

    return x ? x : y;
}

// x- y = x + (-y)
int bin_minus(int x, int y)
{
    //基于 2's compliment 求-b
    y = ~y + 1;

    return bin_add(x, y);
}

int main() 
{ 
    int res1 = bin_add(1,3);
    int res2 = bin_add(5,13);
    int res3 = bin_minus(5,3);
    int res4 = bin_minus(13,15);
    printf("%d %d %d %d\n", res1, res2, res3, res4);

    return 0;
}


上一篇: 校验2个整数符号是否相同
下一篇: 两个数相乘(位移)
作者邮箱: 203328517@qq.com