使用位運算實現加減乘除

經常看到類似”不使用XXX符號的前提下,實現加、減、乘、除“?第一次遇見的同學可能會懵,如果你記起來一個叫位運算的東西就會豁然開朗了。

算法概述

加法:比如5+6。小學的時候數學老師告訴我們的是,先求不算進位的值,也就是1,然後再將進位結果(這裏是1)加入,直到進位爲0。使用位運算也是同樣的道理。只不過我們對於進位和不進位的結果的產生感到陌生而已。

位運算中兩個數相加的不進位結果:a^b,進位結果a&b;之後取a&b左移一位後的結果和a^b相加,如此一直加下去,直到進位爲0,此時就能得到結果。

減法:減法其實也是屬於加法,因爲a-b=a+(-b);於是首先需要將b取相反數,位運算中只要將b位取反後加上1即可,b=~b加1。

乘法:乘法就是多次的加法而已,這裏不再累述。

除法:就是多次的減法,直到被除數小於等於0。

代碼示例

public class Solution3 {

    public int add(int a, int b) {
        int sum = a;
        int arr = b;// 表示進位
        while (arr != 0) {
            sum = a ^ b;
            arr = (a & b) << 1;
            a = sum;
            b = arr;
        }
        return sum;
    }

    public int minus(int a, int b) {
        // b爲減數,先變成負數
        b = add(~b, 1);
        return add(a, b);
    }

    public int multi(int a, int b) {
        // b爲乘數
        for (int i = 0; i < b - 1; i++) {
            a = add(a, a);
        }
        return a;
    }

    public int divide(int dividend, int divisor) {
        // a被除樹,b爲除數
        int a = dividend;
        int b = divisor;
        if(a==1)
            return 0;
        if(b==0)
            try {
                throw new Exception("被除數不能爲0!");
            } catch (Exception e) {
                e.printStackTrace();
                return 0;
            }
        int result = 0;
        if (a > 0 && b > 0) {
            while (a > 0) {
                a = minus(a, b);
                if (a >= 0)
                    result++;
            }
            return result;
        } else if (a < 0 && b > 0) {
            a = add(~a, 1);
            return add(~divide(a, b), 1);// 結果變爲負號
        } else if (a > 0 && b < 0) {
            b = add(~b, 1);
            return add(~divide(a, b), 1);
        } else if (a < 0 && b < 0) {
            a = add(~a, 1);
            b = add(~b, 1);
            return divide(a, b);
        }
        return result;
    }

    public static void main(String[] args) {
        Solution3 solution3 = new Solution3();
        System.out.println(solution3.add(2, 3));
        System.out.println(solution3.minus(15, 3));
        System.out.println(solution3.multi(5, 2));
        System.out.println(solution3.divide(15,3));
    }

}
/*
輸出:
5
12
10
5

*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章