一道有趣的题:计算两个整数的和(不能使用加减法)——半加法

题目链接

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

思路: 采用半加法的思想, 即两个二进制数单独的位相加其结果可以用异或运算得到,进位可以用与运算得到。

例子2+3,相当于10+11

1.10^11=01,carry=(10&11)<<1=100

2.001^100=101,carry(001&100)<<1=0

3.因为carry已经为0,不产生进位,此时的异或运算即为加法的结果101

递归版本

`
class Solution {

public int getSum(int a, int b) {

    if(b==0)return a;

    int carry=(a&b)<<1;

    int sum=a^b;

    return getSum(sum,carry);

}

}

`

循环版本

`
class Solution {

public int getSum(int a, int b) {

    while (b!=0){

        int carry=(a&b)<<1;

        a=a^b;

        b=carry;

    }

    return a;

}

}

`

转载于:https://www.cnblogs.com/HunterJ/p/10615730.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值