// 原理: // 因为按位异或的逻辑很像加法,例如1^0=1,0^0=0 // 唯一不同的是1^1=0,也就是说无法进位 // 于是我们把加法拆成 (全不进位得到的数)+(进位数) // 假设我们算10+9(1010和1001),可以拆成 (0010^0001)+(10000) // 前者只用按位异或,后者用按位与,再左移一位(模拟进位) // 因此我们可以得到 a+b = (a^b) + ((a&b)<<1) // 换一个方式理解,a和b均可拆成 2的指数次方的数 ,我们先把两者共有的数提取出来*2 // 再加上各自独有的数 // 由于加法不能用,要靠迭代进行 // 当其中一方(进位)为0时,退出迭代 function sum(a,b){ if(a==0) return b if(b==0) return a let sumA = a^b; let sumB = (a&b)<<1; console.log(a.toString(2),b.toString(2),sumA.toString(2),sumB.toString(2),); return sum(sumA,sumB) } // 测试 var summ = sum(9,10);