题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
先导知识
http://glgjing.github.io/blog/2015/04/03/markdown-biao-ge-yu-fa/
1. 一位二进制加法真值表:
x | y | sum | carry |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
2. 多位二进制加法
因此进行一位二进制加法,只要对x和y进行XOR和AND运算就可以得出和以及进位。如果要求多位的二进制加法,则要把低位传上来的进位也要计算进去。修改一位二进制加法的真值表,在输入部分中加入低位传入的进位,然后对计算结果进行修正就可以得到多位二进制加法的真值表了。
x | y | icarry | sum | ocarry |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
解题思路
我们通过对x和y进行&位运算,得出每一位上的进位。然后对x和y进行^位运算,得出没有加进位的和。最后将所得的和当做新的x,所得的进位往左移一位(第零位的进位输入为0)当做新的y,继续做上面的步骤,直到进位为0,此时x中保存的就是我们要求的x和y的和了。
Java实现
public class Solution {
public int Add(int num1,int num2) {
while(num2 != 0){
int temp = num1^num2;
num2 = (num1 & num2) << 1;
num1 = temp;
}
return num1;
}
}