另类加法
另类加法
/*
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;
}
};