一【题目类别】
- 位运算
二【题目难度】
- 中等
三【题目编号】
- 371.两整数之和
四【题目描述】
- 给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
五【题目示例】
-
示例 1:
- 输入:a = 1, b = 2
- 输出:3
-
示例 2:
- 输入:a = 2, b = 3
- 输出:5
六【题目提示】
- − 1000 < = a , b < = 1000 -1000 <= a, b <= 1000 −1000<=a,b<=1000
七【解题思路】
- 利用位运算的思想:
- a ^ b:表示无进位相加
- (a & b) << 1:表示相加的进位
- a + b可以为分解为无进位的相加和相加的进位
- 不停的重复以上操作,直到没有进位的时候结束
- 最后返回结果即可
八【时间频度】
- 时间复杂度: O ( l o g ( m a x ( a , b ) ) ) O(log(max(a,b))) O(log(max(a,b))),其中 a a a和 b b b分别为传入参数的值
- 空间复杂度: O ( 1 ) O(1) O(1)
九【代码实现】
- Java语言版
class Solution {
public int getSum(int a, int b) {
int xor = a ^ b;
int carry = (a & b) << 1;
while(carry != 0){
int temp = xor ^ carry;
carry = (xor & carry) << 1;
xor = temp;
}
return xor;
}
}
- C语言版
int getSum(int a, int b)
{
while(b != 0)
{
int carry = ((unsigned int)(a & b)) << 1;
a ^= b;
b = carry;
}
return a;
}
- Python语言版
class Solution:
def getSum(self, a: int, b: int) -> int:
a &= 0xFFFFFFFF
b &= 0xFFFFFFFF
while b != 0:
carry = a & b
a ^= b
b = ((carry) << 1) & 0xFFFFFFFF
return a if a < 0x80000000 else ~(a^0xFFFFFFFF)
- C++语言版
class Solution {
public:
int getSum(int a, int b) {
while(b != 0)
{
auto carry = ((unsigned int)(a & b)) << 1;
a ^= b;
b = carry;
}
return a;
}
};
十【提交结果】
-
Java语言版
-
C语言版
-
Python语言版
-
C++语言版