题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
(看到这道题第一反应是,有点意思。不用加减乘除,难道用与或非吗?一看答案,还真是)
思路:
1:按位与是查看两个数哪些二进制位都为1,这些都是进位位,结果需左移一位,表示进位后的结果
2:异或是查看两个数哪些二进制位只有一个为1,这些是非进位位,可以直接加、减,结果表示非进位位进行加操作后的结果
3:n1&n2是查看有没有进位位了,如果有,需要重复step1、step2;如果没有,保留n1、n2上二进制为1的部分,用或将之合为一个数,即为最后结果
class Solution {
public:
int Add(int num1, int num2)
{
int n1,n2;
n1=(num1&num2)<<1;
n2=num1^num2;
while(n1&n2)
{
num1=n1;num2=n2;
n1=(num1&num2)<<1;
n2=num1^num2;
}
return n1|n2;
}
};
更简洁的写法是(不过感觉这样写挺难懂的)
class Solution {
public:
int Add(int num1, int num2)
{
return num2 ? Add(num1^num2, (num1&num2)<<1) : num1;
}
};