二进制加法运算法则:
0 + 0 = 0, 0 + 1 = 1,1 + 0 = 1,1 + 1 = 10
两个相加的二进制位仅为一位1时,相加为1;两个二进制位全为0,相加为0;两个二进制位全为1,相加为10(相当于二进制中的2,也就是逢2进1)。
位的异或运算跟"求和"的结果一致
异或:1^1 = 0 1^0 = 1 0^0 = 0
求和:1+1 = 0 1+0 = 1 0+0 = 0
位的与运算跟求进位的结果一致
位与:1&1 = 1 1&0 = 0 0&0 = 0
进位:1+1 = 1 1+0 = 0 0+0 = 0
例:
请编写一个函数,将两个数字相加。不得使用+或其他算数运算符。给定两个int A和B。请返回A+B的值
测试样例:
1,2
返回:3
代码如下:
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;
}
};
总结:
- 没有进位的加法
按位异或,异或的结果就是最终的加法结果
- 有进位的加法
拆分,有进位的相加(与运算左移一位)和无进位的相加(异或),