LeetCode 371. 两整数之和

目录结构

1.题目

2.题解


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。 

  1. ​​​​​​​​​​​​​​​​​当不考虑进位问题时,进行“异或”运算,得到加法不算进位的结果,即c = a ^ b = 0100;
  2. 接下来计算进位值,进行“与”运算,即a & b = 0011,发现此时为1的位置表示该位置产生了进位,于是左移一位,使其产生进位,即d = (a & b) << 1 = (0011) << 1 = 0110;
  3. 当进位值不为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;
    }
}
  • 空间复杂度:O(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值