题目描述:
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
题解:
不用加减乘除的加法运算,需要用到位运算。
(1)将两数异或
异或 | |
---|---|
0+0 | 0 ^ 0 = 0 |
0+1 | 0 ^ 1 = 1 |
1+0 | 1 ^ 0 = 1 |
1+1 | 1 ^ 1 = 0(答案错误) |
我们从以上表格可以看出,当涉及到进位时结果就会错误,所以我们需要处理进位。
(2)两数相与并左移一位
与运算 |
---|
1 & 1 = 1(需要进位) |
1 & 0 = 0(无需进位) |
0 & 1 = 0(无需进位) |
0 & 0 = 0(无需进位) |
我们发现,两数相与结果为1时需要进位,为0时则不需进位。
进位操作:((1 & 1) << 1) = ( 0 << 1 ) = 10
拥有了两个基本表达式:
- 执行加法 x ^ y
- 进位操作 ( x & y ) << 1
public class Solution {
public int Add(int num1,int num2) {
int result = 0; //对应位相加
int ans = 0; //进位
do{
result = num1 ^ num2;
ans = (num1 & num2) << 1;
num1 = result;
num2 = ans;
}while(ans != 0);
return result;
}
}