题目
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路
刚看到题的时候想到了位运算,但是不懂怎么用。看了大量网上的解法,仍然似懂非懂,后来画图然后才终于懂了。
顺应网上的大多数例子,5+17的例子。对于十进制的加法 5+17=22 如何计算,实际上,可以分三步进行:第一步只做每位相加不进位,此时相加的结果是12,第二步做进位,5+7中有进位,进位的值为10;第三步,把前面的两个结果加起来12+10的结果是22,刚好5+17=22。
对于二进制尝试同样的思路解决,如图所示:
当进位为零时就是最终的结果。代码如下(含解释)
import java.util.Scanner;
public class OfferWork {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int num1 = 5;
int num2 = 17;
System.out.println(addNum(num1, num2));
}
private static int addNum(int num1, int num2) {
while(num2 != 0) {
int res = num1 ^ num2; //相当于直接相加的结果,不计算进位
int temp = (num1 & num2) << 1; //计算进位的结果(左移之前是可以找出进位的位置)
num1 = res;
num2 = temp;
}
return num1;
}
}
位运算小结(以后再综合总结一下吧~)
& 与运算:只有都为 1 时结果为 1,其他情况都为 0;
与运算的结果左移一位相当于十进制数相加产生的进位是多少;
^ 抑或运算:不相同时为 1,其他情况为 0;
计算结果相当于十进制数相加的结果(不包含进位);
如有错误或不合理的地方,敬请指正~
加油!!