不用加减乘除进行加法运算

题目

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

思路

刚看到题的时候想到了位运算,但是不懂怎么用。看了大量网上的解法,仍然似懂非懂,后来画图然后才终于懂了。

顺应网上的大多数例子,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;

计算结果相当于十进制数相加的结果(不包含进位);


如有错误或不合理的地方,敬请指正~

加油!!

猜你喜欢

转载自blog.csdn.net/qq_37194492/article/details/88823791