不用加减乘除做加法 - Java
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
输入
1,2
返回值
3
1、一位数加法
普通加法 | 异或 |
---|---|
1 + 1 = 0 | 1 ^ 1 = 0(错误) |
1 + 0 = 1 | 1 ^ 0 = 1(正确) |
0 + 1 = 1 | 0 ^ 1 = 1(正确) |
0 + 0 = 0 | 0 ^ 0 = 0(正确) |
可以看到在一位数的运算中,会出现进位丢失的问题。而其他都是正常的。
那么怎么解决进位的问题呢?
与运算 |
---|
1 & 1 = 1(进位) |
1 & 0 = 0(不进位) |
0 & 1 = 0(不进位) |
0 & 0 = 0(不进位) |
与运算中可以看到1&1是伪进位的,为什么说是伪进位呢?因为1和1进位应该是10.但是通过’<<'左移后进变成真正的进位了。是不是很巧妙!
所以得到下面两个表达式:
- 执行加法 x ^ y
- 进位操作 ( x & y ) << 1
栗子:现在有101 和 111两个数
- 101 ^ 111 = 0010 (没有处理进位的加法)
- (101&111)<< 1 = 1010(得到需要进位的数)
- 0010 ^ 1010 = 1000(把进位加上)
- (0010 & 1010) << 1 = 0010 << 1 = 00100 (进位的同时可能会出现新的进位)
- 一直重复,直到进位为0
方法(异或运算和与运算)
public class Solution {
public int Add(int num1,int num2) {
int result = 0;
int carry = 0;
do{
// 异或结果
result = num1 ^ num2;
// 与结果
carry = (num1 & num2)<<1;
num1 = result;
num2 = carry;
}while(carry != 0);
return result;
}
}