LeetCode:371. 两整数之和

不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。

不能用+,-那就只有位运算了。

位运算中的加法
我们先来观察下位运算中的两数加法,其实来来回回就只有下面这四种:

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0(进位 1)

异或:一个重要特性是无进位加法。

a = 5 = 0101

b = 4 = 0100

a ^ b 如下:

0 1 0 1

0 1 0 0

-------

0 0 0 1

与:找到进位的数,再左移一位。

那么问题就容易了,总结一下:

a + b 的问题拆分为 (a 和 b 的无进位结果) + (a 和 b 的进位结果)
无进位加法使用异或运算计算得出
进位结果使用与运算和移位运算计算得出
循环此过程,直到进位为 0

class Solution {
    public int getSum(int a, int b) {
    if (a == 0) {
        return b;
    }
    if (b == 0) {
        return a;
    }
    // (a & b)<<1 计算的是进位
    // a ^ b 计算的是不带进位的加法
    return getSum((a&b)<<1, a^b);
    }
}

 

posted @ 2021-04-23 16:50  蜗壳吃虾米  阅读(41)  评论(0)    收藏  举报