另类加法

另类加法

/*
2022年09月21日 11:43:09
异或是不进位的加法
0001 ^
0011
0010

相与后左移一位即可得到进位的数据

0001 &
0011
0001 << 1
0010

0010 ^
0010
0000

0010 &
0010
0010 <<
0100 最终结果

*/
class UnusualAdd {
public:
    int addAB(int A, int B) {
        if(A == 0) // 任意一个为0的时候就截止
            return B;
        if(B == 0)
            return A;
        int noCarry = A^B;
        int carry = (A&B)<<1;
        return addAB(noCarry, carry);
    }
};
/*
2022年09月21日 11:43:09
最终结果其实就是 A^B + (A&B)<<1
但是不能使用+,因此循环处理右边的部分,直到为0才出来
*/
class UnusualAdd {
public:
    int addAB(int A, int B) {
        while(B != 0){
            int a = A^B;
            int b = (A&B)<<1;
            A = a;
            B = b;
        }
        return A;
    }
};