一、题目
写一个函数,求两个整数之和,要求在函数体内不得使用 “+
”、“-
”、“*
”、“/
” 四则运算符号。
二、示例
2.1> 示例1
【输入】 a = 1, b = 1
【输出】 2
提示:
a
,b
均可能是负数或 0- 结果不会溢出 32 位整数
三、解题思路
既然执行两个数的加法操作,而不允许使用加减乘除之类的操作,我们就可以考虑按位操作来满足计算。为了简化分析过程,我们暂时不考虑进位问题,以下图为例,我们执行a+b
操作,其中a=5
,b=10
,相加后等于15
。那么其实就是a与b执行了异或操作。具体详情请见下图所示:
我们分析明确了可以采用用异或方式执行a
与b
的相加操作,但是不要忘记,里面没有包含进位问题,那么进位问题如何处理呢?我们仔细思考一下,什么情况下会发生进位呢?其实就是a数字的某一位n,与b数字的n位都是1,那么两个数相加后就等于2,而二进制只能由0或1来表示,所以这个“2”就需要执行进位操作了。
那如何进位呢?我们还是以数字a
的第n
位和数字b
的第n
位都是1,那么进位应该前进到第n+1
位,所以针对进位操作,我们要执行如下两个步骤:
【步骤1】首先,执行a&b操作,这样就可以方便的
找出所有的两个数相同位置都是1的位置
了。
【步骤2】然后,执行左移1位,执行进位操作,即:第n
位前进到第n+1
位置。
明确了上面的解题思路之后,我们其实就循环的执行以上两个步骤即可,当发现没有再需要进位的时候(即:carry
等于0),跳出循环即可。下面我们还是按照惯例,举个例子来看一下具体的处理过程,为了方便画图,下面没有画出循环执行所有操作的步骤,因为重点其实就是执行a&b操作和执行左移1位操作,循环执行这两步骤,大家脑补一下就可以了。操作示例请见下图所示:
四、代码实现
class Solution {
public int add(int a, int b) {
while(b != 0) {
int carry = (a & b) << 1; // 计算进位值
a ^= b; // 非进位值相加
b = carry; // 赋值给b,用于计算和判断是否执行进位操作
}
return a;
}
}
今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」