问题描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
知识拓展:&:与(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