不用加法求两数之和

1

大家好,我叫阿美

是一名帝都女算法工程师


2

大家好,我叫阿毛

是一名混日子的帝都男后端


3

阿毛,咱俩做同事那么久了,出个问题考考你呗,如果你能回答上来,给你一个请我吃饭的机会


4

阿美,好呀,好呀,什么问题?追了你那么久,都没答应跟我吃一顿饭,非常期待呦!


3

不用加法,求出两个整数之和


4

我想了半天,也没想出答案,不用加法还想求出两个数之后,你这是故意不给我机会请你吃饭呀


5

阿毛,这么简单的不用加法求和运算,你都回答不上来,平常的算法是怎么学的,就这还想追我!


4

阿美,其实,我挺努力的,不过我平常是做后端应用的,对算法认识不够深刻,要不,你教教我




5

好吧,阿毛,先给你讲讲或运算!


6

回想一下『或』这个词在数学里的意思——『一个元素在集合A或集合B里』意味着『它只在A里』、『它只在B里』、『它在A和B的交集里』这三种情况中的一种。


7

阿美,喔喔,我明白了,这就是或运算的逻辑图呀,红色区域就是代表了A||B,不过这和两个数相加有啥关系呢?




8

阿毛,上面给你讲了或运算,确实和两个数相加没有关系,只是为了给你讲异或运算,让你更明白!


9

『异或』不允许『共存』的情况,所以把A且B的那一部分除掉!



10

喔喔,阿美,这就是异或运算呀,我是不是可以这样理解,A和B相同的部分为假,所以去掉,A和B不同的部分为真,所以保留!



11

是呀,阿毛,异或运算的口诀就是,同为假,异为真!,所以0和1的异或运算如下:0^0 = 0, 

     1^0 = 1, 0^1 = 1,1^1 = 0

再看看0和1的二进制加法,

不考虑进位:1+1=0,

1+0=1,0+1=1,0+0=0,

阿毛,你看在不考虑进位的时候,加法可以用异或实现

12

哇,阿美,还真是这样呢,你不这样对比,我还真没发现加法和异或还有这样的关系



13

阿毛,现在要考虑有进位的情况啦~!还是先看加法吧:0+0进位是0,

1+0、0+1进位是0,1+1进位是1,

再看看与运算:0&0=0;   0&1=0;    1&0=0;     1&1=1;阿毛,你发现了么?在考虑进位运算时,加法和&运算类似呦


14

噗!我听你讲了异或运算^和与运算&,还没有听懂怎么不用加法,求出两个数之和呢?



15

阿毛,你怎么那么笨呀,

那么加法运算可以这样实现:

1)先不考虑进位,按位计算各位累加(用异或实现),得到a;

2)然后计算进位,并将进位的值左移,得到值b。b0,则a就是加法运算的结果;b不为0,则a+b即得结果(递归调用这个过程)。实现算法如下:

public int bitAdd(int a,int b )
{
if(b==0)
{
return a;
   }
int sum=a^b;
   int carry=(a&b)<<1;
   return bitAdd(sum,carry);
}


1661166

哇!阿美,你不仅长的这么漂亮,还这么聪明呢,以前也学过位运算,但是还真没发现它和加法有这么神奇的关系呢!话说,还有机会请你吃饭么?


走,吃饭去!

推荐阅读:

技术:年关到了,程序员是时候考虑离职了

技术:分布式唯一ID极简教程

职场:程序员职业规划

分享:2T架构师学习资料干货分享

觉得有帮助?请转发给更多人!

架构师小秘圈,聚集10万架构师的小圈子!不定期分享技术干货,行业秘闻!汇集各类奇妙好玩的话题和流行动向!长按左侧图片,扫码加入架构师微信群!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值