题目
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:
输入: a = -2, b = 3
输出: 1
解答
-
在位运算中,异或的重要特征是一个无进位加法:
5 + 7 = 12 101 111 ——— => 异或的结果是2 010
这样的话 a ^ b 得到的结果是: 无进位的结果, 要想得到最终结果,就要找到进位数。
-
在位运算中,我们可以通过与运算得到获得进位:
5 + 7 = 12 101 111 ——— => 与的结果是 101 101
很显然,101不是我们想要的进位,1 + 1 的进位应该放到更高的位置,即应该左移一位。
( a & b ) << 1 => 1010
-
重复上面两步,直到与的结果为0,那么异或的结果就是最终结果
/** * 各位相加 010^1010=1000,进位值为100=(010 & 1010)<<1。 * 5 7 * 101 101 * 111 111 * ———— ———— * 010 异或 101 => 左移1位 1010 * * 1010 1010 * 0010 异或 0010 * —————— ————— * 1000 0010 => 左移1位 0100 * * 1000 1000 * 0100 异或 0100 * ———— ———— * 1100 0 */ var getSum = function(a, b) { return b === 0? a : getSum(a ^ b, (a & b) << 1); };