【劍指offer-Java版】47不用加減乘除做加法

不用 + - * / 做加法
輸入兩個整數,不使用四則運算求出這兩個數的和
分析加法運算對應的位運算:
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));
    }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章