不用加号实现加法运算

设计一个函数把两个数字相加。不得使用 + 号算术运算符。

示例:

输入: a = 1, b = 1
输出: 2

提示:

a, b 均可能是负数或 0
结果不会溢出 32 位整数

方法一
真的没用到加号(手动滑稽)

 int add(int a, int b) {
        return a-(-b);
    }

方法二(正经的解题思路)

其实就是用位运算实现加法:

普通加法中:例如 13 + 8

如果我们先将对应位子的数字相加,不考虑进位的话,应该是

3 + 8 = 1 进位为1
1 + 0 = 1 进位为0

之后我们将个位的进位1 与十位上的1相加

1 + 1 = 2 进位为0

如果我们将此方法带入到二进制的运算中是否可行呢?

13 => 1101
8 => 1000

首先我们不考虑进位将两个二进制相加 1101 + 1000 = 0101 这个操作与(1101 异或 1000)的出来的值相同

从上一步中我们可以得出,进位为1,且在第3位(从右往左数)进1位 => 1000 << 1 = 10000

之后将 10000 + 0101 = 10101 => 21 此时进位位0,即可退出。

Java代码如下:

  public int add(int a, int b) {
        while (b != 0) {
            int sum = a ^ b;
            int carry = (a & b) << 1;
            a = sum;
            b = carry;
        }
        return a;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值