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;
    }

总结

这里只要考虑到符号数的计算就不算困难,唯一不好理解的就是进位的规律

如果不好理解,应该用几个整数代入规律尝试一下,如果凭空想象确实不好理解

如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见
posted @ 2021-09-26 08:59  21岁还不是架构师  阅读(109)  评论(0编辑  收藏  举报