1.本题知识点
进制转化,发散思维能力
2. 题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
3. 思路
总体思路:利用二进制位运算
进行相加操作。
首先,先看十进制是如何计算加法。比如5 + 17,
① 相加各位的值,不做进位,得05 + 17 = 12;
②计算进位值,得10;
③将第一步和第二步的结果相加,得 12 + 10 = 22,即为5+17的值。
所以,二进制也采用此方式相加。5的二进制为101,17的二进制为 10001。
① 相加各位的值,不做进位,10001 + 101 = 10100;
② 计算进位值,得10;
③ 将前两步相加得,10100 + 10 = 10110,十进制刚好是22.
继续分析,第一步,不产生进位相加,0 + 0 = 0,1 + 1 = 0,1 + 0 = 1,0 + 1 = 1,即相同为0,不同为1,就是按位异或
操作,10001 ^ 00101 = 10100。
第二步,只有当 位运算1 + 1时才会产生进位,我们可以看出是按位与
运算,当 1 + 1时,按位与得1,再左移一位即可,得到10。与第一步结果相加得 10 + 10100 = 10110,即十进制结果为22。
④ 最终的终止条件:第②步的进位值为0时终止。
Java 版:
public class Solution {
public int Add(int num1,int num2) {
return num2 != 0 ? Add(num1^num2,(num1 & num2) << 1) : num1;
}
}