A + B 问题(给定两个数,求两个数的和,不能使用+号)

要实现不能用加号求两个数的和,我们可以用位运算符。

我们先来代码:

static int add(int a, int b){
    //思路: a+b=a^b + (a&b)<<1;其中a^b是不考虑进位的加.
    //只有位相同才有进位所以(a&b)<<1则是进位的值,
    //每进行一次操作,进位末尾补0,也就是说,最多进行b的二进制位数次操作即可完成计算
    if (b == 0)
        return a;
	    return add(a ^b, (a&b) << 1);
	}
}

实现的原理是

a + b = a^b + a&b << 1

原理就是假定我们随便给两个数,例如       5和7

a ^ b = 

    101
  ^ 111
  -------
    010

a & b << 1 = 

    101
  & 111
  -------
    101

101 << 1 = 1010

然后, a = 010  ,   b = 1010

a ^ b = 

    0101
  ^ 1010
  --------
    1111

a & b << 1

    0101
  & 1010
  --------
    0000

0000 << 1 = 00000

返回a,也就是1111   =  15

其实 ^ 就是不算进位的加法运算

&后<<1也就是进的位,然后一直到位数等于0,也就是没有进位的时候,a的值就是加法成功的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值