写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
数据范围:两个数都满足−10≤n≤1000
进阶:空间复杂度 O(1),时间复杂度 O(1)
输入: 1,2 返回值: 3示例2
输入: 0,0 返回值: 0思路/解法 方式一
可参考学习链接:https://blog.csdn.net/qq135595696/article/details/124460541
我们可以将其想象为两个数的二进制相加,那么关键就在于如果两个数相同的位都为1,那么是应该进位的(即当前位为0,往前一位进1),我们可以使用位运算符将进位(都为1)和不需要进位(一个为0,一个为1)的操作相分离。通过两个数(转化为二进制观察)异或(^)操作,可以取出所有不需要进位的位,然后对于不需要进位的数,只需要直接转为相应十进制就可(即因为不需要进位,所以两个数异或,就是两数相加)。而对于需要进位的数,我们使用让两数按位与(&)操作,然后左移运算(<<)1,那么得到的结果就是相应需要进位的数,然后将进位的数加入相应加入累加到上一次的计算结果,重复上述操作,直至进位为0。
class Solution {
public:
int Add(int num1, int num2) {
while(num2 != 0)
{
int temp = num1;
num1 = num1 ^ num2;
num2 = (temp & num2) << 1;
}
return num1;
}
};
方式二
简单的思路,循环其中的一个值,每次自减1,让另外一个值自增。
class Solution {
public:
int Add(int num1, int num2) {
while(num1 != 0)
{
num2 = num1>0?num2+1:num2-1;
num1 = num1>0?num1-1:num1+1;
}
return num2;
}
};



