题目:
给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
示例 1:
输入:a = 1, b = 2
输出:3
示例 2:
输入:a = 2, b = 3
输出:5
提示:
-1000 <= a, b <= 1000
解法:位运算(二进制)
class Solution {
public:
int getSum(int a, int b) {
while (b != 0) {
// 计算进位
int carry = (unsigned int)(a & b) << 1;
// 计算无进位的和
a = a ^ b;
// 将进位加到a上
b = carry;
}
return a;
}
};
这段代码定义了一个 Solution 类,其中包含一个 getSum 方法,用于计算两个整数的和。该方法使用了位运算的异或(^) 和 与(&) 操作,以及 左移(<<) 操作来计算进位。
- a ^ b 计算了两个数的无进位和。
- (unsigned int)(a & b) << 1计算了两个数的进位,并将进位左移一位,因为进位会出现在更高位上。
在 while 循环中,我们持续进行这两个操作,直到没有进位(即 b变为0)为止。最后,返回累加结果 a。
假设 a = 2 且 b = 3,它们的二进制表示(使用4位来简化)如下:
a = 0010 (十进制中的2)
b = 0011 (十进制中的3)
现在,如果我们只考虑不进位的和,我们可以直接对每一位进行异或操作:
0010
^ 0011
------
0001 (十进制中的1)
考虑和的计算
0010
0011
-----
0101 (十进制中的5)
这个问题涉及到了二进制中的 异或(XOR)运算。异或运算的特点是:
当两个相应的二进制位相异时,结果为1;相同时,结果为0。
给定的两个二进制数是 0101 和 0011。
我们逐位进行异或运算:
第一位(从右边开始数,即最低位):1 XOR 1 = 0
第二位:0 XOR 0 = 0
第三位:1 XOR 1 = 0
第四位:0 XOR 0 = 0
将这四个结果组合起来,我们得到 0110。
过程