题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
完整代码
解题思想
这道题最关键的是解题思路:
两步走:用二进制的运算来实现
- 相加计算各位的值,不算进位值:
5+7=>2 - 计算进位值:
5+7的进位值为10,如果进位值为0,那么上一步就是计算结果
如何用二进制的运算来实现这两步:
-
相加计算各位的值: 用异或来实现
(只进行加法操作,不进位得到:010)
5(101),7(111)
101^111=010 -
计算进位值:用与运算和移位来实现
(只进行进位操作,得到:1010)
101&111=101
101<<1=1010
重复上述两步计算直到进位值为0
int add(int s1,int s2){
int jh,jw,t;//jh:加和;jw:进位
jh=s1^s2;
jw=(s1&s2)<<1;
while(jw!=0){
t=jh;
jh=jh^jw;
jw=(t&jw)<<1;
}
return jh;
}
二刷
二刷时,想到了将相加和进位分开来做,但相加应该用异或实现,自己想成了或运算。
基本思想:
相加和进位操作分开实现
- 相加时:1 0 = 1,0 0 = 0, 1 1 = 0,这是标准的异或操作,相同为0,不同为1
- 进位时: 0 0 = 0, 1 0 = 0, 1 1 = 1,这是位与操作,只不过要加上移位操作,向左移一位
- 上述运算用循环实现,直到进位操作不为0
class Solution {
public:
int Add(int num1, int num2)
{
//相加和进位分开处理
//相加:异或
//进位:与操作+移位
int sum, add;
do{
sum = num1 ^ num2;
add = (num1 & num2) << 1;
num1 = sum;
num2 = add;
}while(add != 0);
return sum;
}
};