剑指offer48
不用加减乘除做加法
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
输入
1,2
输出
3
思路
补充知识:
两个数按位与&结果是进位位
两个数按位异或^结果是非进位位
两个数按位或|结果是两个数合并后的结果
过程:
step1:按位与&是查看两个数哪些二进制位都为1,这些都是进位位,结果需左移一位,表示进位后的结果
step2:异或^是查看两个数哪些二进制位只有一个为1,这些是非进位位,可以直接加、减,结果表示非进位位进行加操作后的结果
step3:n1&n2是查看有没有进位位了,如果有,需要重复step1、step2;如果没有,保留n1、n2上二进制为1的部分,用或|将之合为一个数,即为最后结果
代码
public class Solution {
public int Add(int num1,int num2) {
int n1,n2;
n1=(num1&num2)<<1;
n2=num1^num2;
boolean jinwei_flag = (n1&n2)!=0?true:false;
while(jinwei_flag){
num1=n1;
num2=n2;
n1=(num1&num2)<<1;
n2=num1^num2;
jinwei_flag = (n1&n2)!=0?true:false;
}
return n1|n2;
}
}