题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路
用位运算来模拟加法。两个二进制数之间的异或相当于不考虑进位的加法,如1010^1011=0001(对应十进制10^11=1),因为只有1+1才会产生进位,所以通过与运算计算进位1010&1011=1010,将不考虑进位的加法结果与进位左移一位(10100)相加就是考虑进位后的加法结果,相加的过程还是通过前面两个步骤来模拟,直至进位为0。整个步骤如下:
(1)两个数字异或获得不考虑进位的加法结果;
(2)两个数字与操作并左移一位获得进位;
(3)将前两步得到的两个结果替换原来的两个数字,直至进位为0。
代码如下:
class Solution {
public:
int Add(int num1, int num2)
{
int sum = num1, carry=num2;
while(carry!=0){
sum = num1^num2;
carry = (num1&num2)<<1;
num1 = sum;
num2 = carry;
}
return sum;
}
};
拓展
不使用新变量交换两个变量a,b的值。
方法一:使用加法
a = a+b;
b = a-b;
a = a-b;
方法二:使用异或
a = a^b;
b = a^b;
a = a^b;