LeetCode——371. 两整数之和(Java)
题目描述
题干:
给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
示例 1:
输入:a = 1, b = 2
输出:3
示例 2:
输入:a = 2, b = 3
输出:5
题解思路
返回两数之和,不过不能使用加减号,理所当然先想到的就是位运算
这里的a和b可能为正有可能为负,所以我们必须考虑到正负数的位运算规则
有符号整数通常用补码来表示和存储,补码具有如下特征:
-
正整数的补码与原码相同;负整数的补码为其原码除符号位外的所有位取反后加 11。
-
可以将减法运算转化为补码的加法运算来实现。
-
符号位与数值位可以一起参与运算。
所以根据以上规则,我们可以总结出计算规律:
-
在不考虑进位的情况下,其无进位加法结果为 a⊕b。
-
而所有需要进位的位为 a & b,进位后的进位结果为 (a & b) << 1。
正确代码
public int getSum(int a, int b) {
while (b != 0) {
int carry = (a & b) << 1;
a ^= b;
b = carry;
}
return a;
}
总结
这里只要考虑到符号数的计算就不算困难,唯一不好理解的就是进位的规律
如果不好理解,应该用几个整数代入规律尝试一下,如果凭空想象确实不好理解
如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见