不使用加减乘除计算两个数的和

国际惯例,先上代码:

public int Add(int num1,int num2){
    int tmp = num1;
    num1 = tmp^num2;
    num2 = tmp&num2;
    return num2 == 0?num1:Add(num1,num2 << 1);
}

分析:
1.两数字a、b相加,其实是二进制的相加
2.两个数字异或运算,结果为c,
3.两个数字与运算,若等于0,则表示没有进位,返回c即可
否则,存在进位,结果为d
4.将d左移1位,与c进行相加,重复1-4即可。

举例:3(011)和5(101)

3^5=011^101=110
3&5=011^101=001
因为001不等于0,表示有进位,左移1位,为010
将110和010相加
110^010=100
110&010=010
因为010不等于0,表示有进位,左移1位,为100
将100和100相加
100^100=000
100&100=100
因为100不等于0,表示有进位,左移1位,为1000
将1000和000相加
1000^0000=1000
1000&0000=0000
0000等于0,没有进位,返回1000(8)即可

结论:3+5=8

注:减法类似

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值