题目:
请写一个函数,求两个整数的和,要求在函数体内不得使用“+”、“-”、“×”、“÷”四则运算符号。
分析:
考虑十进制下,我们是如何做加法运算的,比如5+17=22。可以分为3步。
- 将各位相加,不进位,分别是5+7=2,1+0=1。
- 处理进位,5+7中有进位,进位值是10。
- 将第1步和第2步的结果相加,12+10=22=5+17。
既然不能使用加减乘除,那么只能使用位运算了。5的二进制是101,17的二进制是10001,使用上面的方法进行运算。
- 将各位相加,不进位,得到结果10100,对应的十进制是20。
- 处理进位,进位是二进制的10,对应十进制的2。
- 将第1步和第2步的结果相加,是二进制的10110,对应十进制是22。
对于第一步,0+0=0,0+1=1,1+0=1,1+1=0,这个效果和异或的结果是一样的。
对于第二步,只有1+1会产生进位。可以看做两个位做与运算,再左移一位。
对于第三步,将第一步和第二步的结果相加,此时继续重复第一步和第二步的步骤,直到最后不产生进位为止。
解法:
package com.wsy;
public class Main {
public static void main(String[] args) {
int a = 5, b = 17;
System.out.println(fun(a, b));
}
public static int fun(int a, int b) {
int num1, num2;
while (b != 0) {
num1 = a ^ b;
num2 = (a & b) << 1;
a = num1;
b = num2;
}
return a;
}
}