不用 + - * / 做加法
輸入兩個整數,不使用四則運算求出這兩個數的和
分析加法運算對應的位運算:
1 等價於兩個數先做異或運算 – 相當於不考慮進位的加法
2 然後按位與運算並將與運算的和左移一位 – 相當於考慮進位
3 將1中的結果賦值給第一個數,將2中的結果賦值給第二個數
4 如果第二個數不爲0,重複1 2 3
public class _Q47<T> {
// 不用四則運算 求兩個數的和
public int Add(int num1, int num2){
int sum = 0;
int carry = 0;
do{
sum = num1 ^ num2;
carry = (num1 & num2)<<1;
num1 = sum;
num2 = carry;
}while(carry != 0);
return num1;
}
}
測試代碼:
public class _Q47Test extends TestCase {
_Q47<?> add = new _Q47();
public void test() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
int num1 = 5;
int num2 = 17;
System.out.println(add.Add(num1, num2));
num1 = 0;
num2 = 0;
System.out.println(add.Add(num1, num2));
num1 = -5;
num2 = -17;
System.out.println(add.Add(num1, num2));
num1 = -5;
num2 = 17;
System.out.println(add.Add(num1, num2));
num1 = -5;
num2 = 0;
System.out.println(add.Add(num1, num2));
System.out.println(add.Add(Integer.MIN_VALUE, Integer.MAX_VALUE));
}
}