题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
题目解析
题目比较明确,不用加减乘除的方式来计算两个数字的和,应该很自然的想到用与或非等逻辑运算以及位移作为辅助的方式来计算其值。
解题思路
模拟一个加法的过程
5 + 1
101
00 1
------
110
这里面涉及到了进位,如果去掉进位来看,也就是末尾的1+1进位转为0了,那么现在的数为100,然后进位数字为1,进位1位相当于1<<1,然后再不考虑进位的情况下继续加法算出其值,也就是110,然后这时候,计算进位为0,也就是说不进位,那么这个计算出来的值就是结果,当然,如果说是7+1的话需要不断的进位,这个时候就是一个进位与在不考虑进位值的情况下计算出来的值的一个不断叠加的过程,那么,不考虑进位值这个过程对应于逻辑运算应该是异或,而进位过程应该是求两者的&运算,相同的值都为1的时候,存在进位。
代码实现
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;
}
}
先求出两者不考虑进位的情况下的和,然后求出进位,判断进位是不是0,不是0就说明存在进位,那么就要继续将当前的值重复这一过程。