目录结构
1.题目
不使用运算符 +
和 -
,计算两整数 a
、b
之和。
示例:
输入: a = 1, b = 2
输出: 3
输入: a = -2, b = 3
输出: 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
位运算。假设a = 0111,b = 0011,a + b = 1010。
- 当不考虑进位问题时,进行“异或”运算,得到加法不算进位的结果,即c = a ^ b = 0100;
- 接下来计算进位值,进行“与”运算,即a & b = 0011,发现此时为1的位置表示该位置产生了进位,于是左移一位,使其产生进位,即d = (a & b) << 1 = (0011) << 1 = 0110;
- 当进位值不为0,重复1和2:
- 将c和d按照1方式做加法,即e = c ^ d = 0010;按照2方式计算进位,即f = (c & d) << 1 = (0100) << 1 = 1000;
- 将e和f按照1方式做加法,即e ^ f = 1010;按照2方式计算进位,即(e & f) << 1 = (0000) << 1 = 0000; 此时进位值为0,则1010即为结果。
public class Solution371 {
@Test
public void test371() {
System.out.println(getSum(10, 20));
}
public int getSum(int a, int b) {
while (b != 0) {
int sum = a ^ b;
b = (a & b) << 1;
a = sum;
}
return a;
}
}
- 空间复杂度: