描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
数据范围:两个数都满足 −10 ≤ n ≤ 1000 进阶:空间复杂度 O(1),时间复杂度 O(1)
示例1
输入:1,2
返回值:3示例2
输入:0,0
返回值:0解题方法:
【题目解析】:不使用+运算符进行加法运算
【解题思路】:数字的相加可以转换为二进制的加法,注意每一位相加与进位即可
1. **<mark>两个数异或</mark>:相当于每一位相加,而不考虑进位;**
1. **<mark>两个数相加并进位</mark>:相当于求出了会产生进位的位,所以最后要左移,变成进位**比如下面的例子:
5 0101 + 7 0111
不考虑进位的相加结果 0101^0111 -> 0010
相加的进位 0101&0111 -> 0101 因为进位左移得到 1010
1010 + 0010
不考虑进位的相加结果 1010 ^ 0010 -> 1000
相加的进位 1010 & 0010 -> 0010 因为进位左移得到 0100
1000 + 0100
不考虑进位的相加结果 1000 ^ 0100 -> 1100
相加的进位 1000 & 0100 -> 0000 进位为0结束运算代码:
class Solution {
public:
int Add(int num1, int num2) {
// 让num1作为不考虑进位的相加结果,即异或
// 让num2作为每次相加的进位,注意要左移后才是进位,即先与然后左移
while(num2 != 0) // 直到进位为0则结束
{
int tmp = (num1 ^ num2);
num2 = (unsigned int) (num1 & num2) << 1; // c++中负数不支持左移,所以要转化为wu'fu'h
num1 = tmp;
}
return num1;
}
};