图片说明

分步考虑:

  1. 首先只做加法,不考虑进位问题。1+0=1;0+1=1;0+0=0;1+1=0(不考虑进位),所以相当于做 异或 运算
  2. 接着只考虑进位。只有1+1会发生进位,所以相当于做按位与运算。与运算的结果中为1的位说明该位发生进位。
  3. 发生进位应该左移一位。若没发生进位,则相与的结果为0,左移一位还是0
  4. 将不考虑进位的结果和只考虑进位相加(其实就是将1.和2.和3.的结果相加),相加的时候还有可能再产生进位,因此二者相加的过程可以再次重复循环步骤1和2和3,直到(m&n)<<1变为了0,这时候不会再产生进位,退出循环即可。
    以9 和 12 为例:
    9的二进制 1001 12的二进制 1100
    第一步: 1001^1100= 101
    第二步: 1001&1100=1000
    第三步:进位 1000 -> 10000
    开始重复
    第四步: 101^10000 = 10101
    第五步: 101&10000 = 0
    结束
    结果为10101 = 21
function Add(num1, num2)
{
    // write code here
    let xor = 0;
    while(num2 != 0){
        xor = num1 ^ num2;
        num2 = (num1 & num2) << 1;
        num1 = xor;
    }
    return num1;
}