题目

371. 两整数之和 - 力扣(LeetCode)

给你两个整数 ab不使用 运算符 +- ,计算并返回两整数之和。

示例 1:

1
2
输入:a = 1, b = 2
输出:3

示例 2:

1
2
输入:a = 2, b = 3
输出:5

提示:

  • -1000 <= a, b <= 1000

解题

不使用+-算术运算符,通过位运算可以实现加法:

1
2
3
4
5
6
7
8
9
10
11
// 0+0=0,0+1=1,1+0=1,1+1=0(进位)
class Solution {
public int getSum(int a, int b) {
while (b != 0){
int carry = (a & b) << 1; // 计算所有需要进位的 bit
a ^= b; // 异或操作,相当于无进位加法
b = carry; // 将进位应用于下一位相加
}
return a;
}
}

这里使用了位运算中的异或(^)和与(&)操作来模拟不带进位的加法。

具体步骤如下:

  1. (a & b) << 1 计算出所有需要进位的 bit,将其左移一位,得到进位值(因为只有11与运算之后才是1)。
  2. a ^= b 对 a 和 b 进行异或操作,相当于不考虑进位的加法。
  3. b = carry 将进位应用于下一轮相加。

这样,通过循环,直到没有进位为止,最终得到了两数之和。