JS:两个数不使用四则运算得出和

// 原理:
// 因为按位异或的逻辑很像加法,例如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);

 

posted @ 2020-03-21 09:53  兔子大叔  阅读(428)  评论(0编辑  收藏  举报