实例4:发散思维能力——不用加减乘除做加法

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

知识拓展:&:与(x&y)两二进制上下比较只有位值都为1时才取1,否则取0。
例如:14&15  (14  二进制  1110,15 二进制   1111   ——&与的结果 :1110  ---->结果14)
|:或(x|y)两二进制上下比较只有位值都为0时才取0,否则取1。
例如:14|15  (14  二进制  1110,15 二进制     1111  ——|或的结果:1111 ---->结果15)
^:异或(x^y)两二进制上下比较只有位不相等时才取1,否则取零。
例如:14^15  (14  二进制  1110,15 二进制   1111   ——^异或的结果:0001 ---->结果1)

问题分析:第一感觉使用二进制的位运算。最后写出来是一个迭代的过程。每次迭代先计算x和y的和但不处理进位,那么相当于做异或,得到res1;然后处理进位问题,相当于计算与运算,得到res2;那么res2左移1位,再加到res1上,则整个运算的最终结果转化为res1+(res2<<1);因为res2做左移,总会减小到0,那时候的res1就是最终结果。

代码实现:

public class Solution {
	public int Add(int num1,int num2) {
        int sum,mark;
	    do{
	        sum = num1^num2;
	        mark = (num1&num2)<<1;
	        num1=sum;
	        num2=mark;
	    }while(num2!=0);
	    return num1;
    }
	
	public static void main(String[] args) {
		Solution solution = new Solution();
		int sum = solution.Add(5, 7);
		System.out.println(sum);
	}
}

运行结果:

12

猜你喜欢

转载自blog.csdn.net/qq_35070001/article/details/79461554
今日推荐