使用位运算实现加减乘除

经常看到类似”不使用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

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