LeetCode-Sum of Two Integers

本文介绍了一种不使用加法和减法运算符计算两整数之和的方法,通过位操作实现。具体而言,利用异或操作处理无进位加法,与操作结合左移处理进位,递归直至无进位发生。

Description:
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example 1:

Input: a = 1, b = 2
Output: 3

Example 2:

Input: a = -2, b = 3
Output: 1

题意:计算两个正数的和,要求不可以使用加法和减法;

解法:既然说明了不可以使用加法和减法,那么我们可以考虑使用位操作;

  • 对于异或^操作来说,a ^ b得到的结果是两个数的二进制表示中不相同的位置
  • 对于与&操作来说, a & b得到的结果是两个数的二进制表示中相同的位置

要对两个数的二进制位进行求和,我们需要考虑两种情况:

  • 如果当前位两个数不相同,即一个是1,另外一个是0的情况,利用异或可以得到相加的结果
  • 如果当前位两个数相同,都是0或者都是1的情况,我们就需要考虑到进位

对于这道题目我们可以这么想,如果b已经是0了,那么相加的结果就是a了;否则,我们令a = a ^ b将两个数的二进制表示中位不相同的位置(一个位是1,另外一个位是0的情况)求和,令b = (a & b) << 1将两个数的二进制表示中位相同的位置(都是0或者都是1的情况)求和,左移一位是因为如果两个数的当前位都是1,求和会产生进位;一直重复这个操作,直到b的值为0,表示此时没有都是1的位了,也就是没有进位,说明a ^ b得到的就是最后的求和结果;

Java
class Solution {
    public int getSum(int a, int b) {
        return b == 0 ? a : getSum(a ^ b, (a & b) << 1);
    }
}

所有的代码都保存在GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值