描述:出两个整数a和b, 求他们的和, 但不能使用 +
等数学运算符。
解题思路:
根据提示,本题需要借助位运算模拟加法运算。首先想到的是异或运算,按位异或可以模拟一种不进位的加法运算,如二进制的11^10=01,每一位异或都相对于每一位的加法,但是缺乏进位。如何解决进位的问题呢?
由于异或运算仅仅是忽略了进位,那么每次有进位发生时,异或运算相当于忽略了高位的一个1。使用按位与“&”运算可以帮助我们判断该位是否有进位。如11&11 =11,说明两位在加运算中都产生了进位1。由于该进位是加在高位上的,所以很自然的想到了把与运算的结果往左移一位,再和异或结果相加,即为最后结果。
package lintcode;
/**
* Class Name : AplusB_1
* Describe :
* Create User : Leon
* Create Date : 2018/1/29
* Create Time : 13:04
**/
public class AplusB_1 {
public static int aplusb(int a, int b) {
if (b == 0)
return a;
else
return aplusb(a ^ b, (a & b) << 1);
}
}