/**
* 不用加减乘除做加法
*
* 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
*/
public class JZ048AddSolution {
public static int Add(int num1,int num2) {
if(num1 == 0){//表示进位的值为零才可以
return num2;
}
int yihuo = num1 ^ num2;//第一步各位相加但不计进位计算;
int yu = (num1 & num2) << 1;//第二步求进位(使用位移运算向左移动一位,这样才算时进一位)。位左移运算优先级高于位与运算
return Add(yu, yihuo);//递归调用,直到yu(num1)为零。
}
public static void main(String[] args) {
int num1 = 5;
int num2 = 7;
System.out.println(Add(num1, num2));
}
/*
总结:
1、基本的位操作符有与、或、异或、取反、左移、右移这6种
& 与 有0则0,全1为1
| 或 有1则1,全0则0
^ 异或 相同为0,不同为1
~ 取反 0变1,1变0
<< 左移
>> 右移
2、上述题目模拟
2.1、怎么模拟加法
采用异或可以模拟不带进位的加法运算,因为同则为0,异则为1
2.2、怎么判断是否进位
进位的产生主要是1+1=10, 我们看到与操作可以判断两个位是不是需要进位,可见用与运算可以模拟出每一位的是否有进位
2.3、怎么表示进位
进位无非是进到上一位去, 因此我们直接与的结果左移一位即得进位
最后当进位为0时,表示结束。
*/
}