Java使用位運算進行int的加減乘除運算

通過位運算計算int的加減乘除:

加法原理:a+b

位的異或運算求'和'的結果一致:

異或 1^1=0 1^0=1 0^0=0

求和 1+1=0 1+0=1 0+0=0

位的與運算求'進位‘的結果一致:

位與 1&1=1 1&0=0 0&0=0

進位 1+1=1 1+0=0 0+0=0

所以a+b = (a^b)+((a&b)<<1)

減法原理:a-b

減去一個正數等於加上這個負數的補碼.一個正數的補碼是它的原碼.一個負數的補碼等於它的反碼+1.即 -b = ~b+1.所以a-b = a+(-b) = a+ ~b+1.

補碼的規定如下:

對正數來說,最高位爲0,其餘各位代表數值本身(以二進制表示),如+42的補碼爲00101010。
對負數而言,把該數絕對值的補碼按位取反,然後對整個數加1,即得該數的補碼。如-42的補碼爲11010110(00101010按位取反11010101+1即11010110)

【例1】對 5 進行取反。

假設爲16位。

5轉換爲二進制數爲: 0000 0000 0000 0101得到二進制數

每一位取反: 1111 1111 1111 1010得到最終結果的補碼

取補碼: 1000 0000 0000 0110得到最終結果的原碼

轉換爲十進制數:-6

則 5 取反爲 -6 .

【例2】對 -5 進行取反。

假設爲16位。

-5 轉換爲二進制數爲: 1000 0000 0000 0101得到二進制數

取補碼: 1111 1111 1111 1011得到二進制數的補碼

每一位取反: 0000 0000 0000 0100 得到最終結果的補碼

取補碼: 0000 0000 0000 0100得到最終結果的原碼

轉換爲十進制數:4

則 -5 取反爲 4 .

如果用適合人類運算的計算方法:

如對 a 按位取反,則得到的結果爲 -(a+1) .

此條運算方式對正數負數和零都適用。

所以~(b-1)=-b可得a-b=a+(-b)=a+(~(b-1))。把減法轉化爲加法即可。

乘法原理:a*b

1.用循環加法替代乘法。a*b,就是把a累加b次。時間複雜度爲O(N)。

2.在二進制數上做乘法.就是根據乘數的每一位爲0或1時,將被乘數錯位的加在積上。時間複雜度爲O(logN)

除法原理:a/b

1.從被除數上減去除數,看能減多少次之後變得不夠減。時間複雜度爲O(N)。

2.採用類似二分法的思路,從除數*最大倍數開始測試,如果比被除數小,則要減去。下一回讓除數的倍數減少爲上一次倍數的一半,這樣的直到倍數爲1時,就能把被除數中所有的除數減去,並得到商。時間複雜度降低到O(logN)。

/**
     * 加法
     * @param a
     * @param b
     * @return
     */
    public static int add(int a,int b) {
        int res=a;
        int xor=a^b;//得到原位和
        int forward=(a&b)<<1;//得到進位和
        if(forward!=0){//若進位和不爲0,則遞歸求原位和+進位和
            res=add(xor, forward);
        }else{
            res=xor;//若進位和爲0,則此時原位和爲所求和
        }
        return res;
    }

    /**
     * 減法
     * @param a
     * @param b
     * @return
     */
    public static int minus(int a,int b) {
        int B=~(b-1);
        return add(a, B);
    }

    /**
     * 乘法
     * @param a
     * @param b
     * @return
     */
    public static int multi(int a,int b){
        int i=0;
        int res=0;
        while(b!=0){//乘數爲0則結束
            //處理乘數當前位
            if((b&1)==1){
                res+=(a<<i);
                b=b>>1;
                ++i;//i記錄當前位是第幾位
            }else{
                b=b>>1;
                ++i;
            }
        }
        return res;
    }

    /**
     * 除法
     * @param a
     * @param b
     * @return
     */
    public static int sub(int a,int b) {
        int res=-1;
        if(a<b){
            return 0;
        }else{
            res=sub(minus(a, b), b)+1;
        }
        return res;
    }
    public static void main(String[] args) {
        //加法運算
        int result1 = add(90,323);
        System.out.println(result1);

        //減法運算
        int result2 = minus(413,323);
        System.out.println(result2);

        int result3 = multi(90,2);
        System.out.println(result3);

        int result4 = sub(90,2);
        System.out.println(result4);
    }

 

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