你会不用运算符做加法吗?

249 阅读2分钟
1:题目

给定两个32位的整数a和b,可正,可负,可以为0,不能使用算数运算符,实现a和b的加法操作


2:规定

1:不能有“+”,“-”,“*”,“/”四个运算符

2:如果给定的值相加导致了数据的溢出,你可以不考虑这些


3:思考

1:先举个十进制相加的例子:14+19

a)先加个位的数,加出来是13,那就个位写3,保留十位的1

b)十位相加,1+1得到是2 ,再加上个位保留的进位数1,十位就等于2+1=3;

c)得到结果33


上面是十进制相加的做法,那么如果把它们转换成二进制,怎么做呢?

a)把14 改成二进制1110,19改成二进制10011

b) 将两个二进制数相加,等同于十进制数相加,只不过十进制是遇10进1,二进制是遇2进1.

c)得到的结果是100001,转换成十进制后也是等于33


通过上面的分析,我们可以通过从低位到高位“求和”和“进位”的方式。下面看下14+19的例子

num1 01110

num2 10011

-----------------------------------------

上面2值^的结果 11101

上面2值&<<1的结果 00100

-----------------------------------------

上面2值^的结果 11001

上面2值&<<1的结果 01000

-----------------------------------------

上面2值^的结果 10001

上面2值&<<1的结果 10000

-----------------------------------------

上面2值^的结果 00001

上面2值&<<1的结果 100000

-----------------------------------------

上面2值^的结果 100001

上面2值&<<1的结果 000000

-----------------------------------------

最后&<<1的结果为0,则过程终止,返回100001,转换成十进制就是33.


4:代码


延伸:如果想实现a和b的“减乘除”操作,你的思路又是什么呢?请关注下面的公众号,我们将在下节讲解哦。


注:

&:如果相对应位都是1,则结果为1,否则为0

|:如果相对应位都是0,则结果为0,否则为1

~:反运算符翻转操作数的每一位,即0变1,1变0

^:如果相对应位值相同,则结果为0,否则为1


如果你觉得这篇文章有用,记得分享给其他的小伙伴,大家一起进步哦~~~



扫一扫 关注我的公众号

如果你想要跟大家分享你的文章,欢迎留言投稿~

如果你喜欢,请留下你的赞哦