a+b是一个非常简单的问题,基本上是编程初学者在hello world后第二个想去尝试完成的功能,本文将不使用+号及其他算术运算符,采用位运算的方式实现a+b
先举一个十进制加法的例子,比如45+67=112,如果不考虑进位得到的结果是2,只考虑进位得到的结果是110,加起来正好是112,对于二进制其实也是这样的,因此我们可以将加操作和进位操作分开,二进制不进位加法其实就是异或操作,而进位操作实际上就是两个数对应位都为1时的左移,考虑到进位次数有限,当进位为0时,加出来的就是答案了
int add(int a, int b) {
if (b == 0) {
return a;
}
int sum = a ^ b; //加操作
int carry = (a & b) << 1; //进位操作
return add(sum, carry); //将加操作结果加上进位操作结果
}
递归的效率有时不高,很容易转换成迭代
int add2(int a, int b) {
int sum = 0, carry = 0;
while (b) {
sum = a ^ b;
carry = (a & b) << 1;
a = sum;
b = carry;
}
return a;
}