不用加号的加法
力扣中不用加号的加法:面试题17.01
问题:设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。
代码实现:
class Solution {
public int add(int a, int b) {
while((a&b)!=0){//这两数的字节码相加是否会产生进位
int temp=a;
a=(a&b)<<1;//对会产生进位的位置进行进位
b=(b^temp);//当a+b不进位时,运算
}
return a^b;//将最终不在会产生进位的两数相加
}
}
解释:两数相加时,其二进制中相对应的每一位值的运算有以下几种可能:
a | 0 | 0 | 1 | 1 |
---|---|---|---|---|
b | 0 | 1 | 0 | 1 |
+ | 0 | 1 | 1 | 10 |
如图可知:当两数的相同位不全为1时,可使用^进行计算;当两数的相同位都是1时,将产生进位。
计算步骤:
- 循环判断 a&b是否等于零(判断是否会产生进位)
- 由于a在接下来的运算中将被改变,故使用临时变量temp存储a的值
- a=( a&b)<<1;(将两数相加会产生进位的数进行进位并赋予a)
- b=b^temp;(两数进行不进位的加法运算并将值赋给b)
- 重复步骤(1-4)
- 直至a,b进行加法运算时不再产生进位,退出循环
- 此时的a,b进行加法运算时,不会产生进位,res=a^b;