首頁 > 軟體

Java利用位運算實現加減運算詳解

2022-12-31 14:01:13

前言

本文主要介紹如何使用位運算來實現加減功能,也就是在整個運算過程中不能出現加減符號。

加減乘除運算在計算機中,實際上都是用位運算實現的,今天就用位運算來模擬下加法和減法的運算功能。

思路分析

先分析如何用位運算實現加法運算。

範例

假設a=23b=36,使用位運算實現加法得到結果59

首先來看下233659的二進位制資訊。

從上面的圖中可以看到,兩個數相加的結果與兩個數互斥或的結果很相似,只不過在圖中的2位置相加的時候,產生了進位,而互斥或是沒有進位的,如果能拿到進位資訊,把兩個數互斥或的結果和進位資訊的結果相加就能得到最終結果了,那麼如果能拿到進位資訊呢?

位運算進位

上圖中,59的二進位制資訊可以分為兩部分,01100110001000,再結合2336的二進位制資訊來看,01100112336的互斥或結果,而2336相與的結果跟0001000很相似,只不過0001000中的1比相與結果往前移了一位。

於是,我們可以得出,兩個數的二進位制進位資訊為兩個數的相與在左移一位。

初步結果

經過上面的分析,我們可以得到了一個初步的運算結果,即兩個數相加等於兩個數互斥或加上兩個數的相與左移1位,也就是a + b = (a ^ b) + ((a & b) << 1)

先用2336來驗證下。

經過驗證可以看到,剛才得出的結論是正確的。

但是,我們要做到在整個運算過程中不能出現加號,接下來要想辦法把這個加號給去掉。

去除加號

還是以2336為例,經過上面的運算我們把運算的位運算結果給化簡下。

23 + 36 = (23 ^ 36) + ((23 & 36) << 1) = 51 + 8

也就是把2336的相加運算轉化為了518的相加運算,接下來繼續分析518的相加運算,也是通過互斥或和相與進行操作。

51 + 8 = (51 ^ 8) + ((51 & 8) << 1) = 59 + 0

嗯?可以發現我們已經得出59了,而且還加了個0,加了個0不就相當於加了個寂寞嘛,可以直接省略啊。

由此,我們又可以得出一個結論,兩個數的二進位制進位資訊為兩個數的相與在左移一位,不停地迴圈這個過程,直到有一個數變為0,就能得到結果。

整體思路

現在來總結下整體的計算過程:

  • 把兩個數相加,拆分成兩步,兩個數互斥或加上兩個數相與左移1位。
  • 判斷相與左移的結果是否為0。
  • 如果相與左移為0,兩個數互斥或的結果即為相加的結果。
  • 如果相與左移結果不為0,把得到的新結果,重複執行第1~3步操作。

加法程式碼實現

經過上面的分析,來看下程式碼實現。

public class Code19_Add {
   public static int add(int a, int b) {
       int sum = 0;
       while (b != 0) {
           sum = a ^ b;
           b = (a & b) << 1;
           a = sum;
       }
       return sum;
   }
    public static void main(String[] args) {
        int sum = add(23, 36);
        System.out.println(sum);
    }
}

執行程式,輸出結果為59。

減法實現

減法分析

還是以2336為例,如果要計算 36 - 23,該怎麼辦?

36 - 23 不就相當於36 + (-23),可以理解為加上一個負數,這就可以了嗎?不不不,要求的是不能出現加減符號,-23裡面是有減法這個符號的。

還記得前面我們分析的負數可以怎麼表示嗎?對了,負數是對一個數的取反再加1。嗯?又出現加號了,不過加法我們不是已經實現了嗎?直接拿來用就好了。

減法程式碼實現

有了加法操作,減法就很簡單了,來看下程式碼。

public class Code20_Sub {
    public static int add(int a, int b) {
        int sum = 0;
        while (b != 0) {
            sum = a ^ b;
            b = (a & b) << 1;
            a = sum;
        }
        return sum;
    }
    public static int sub(int a, int b) {
        return add(a, add(~b, 1));
    }
    public static void main(String[] args) {
        int sum = sub(36, 23);
        System.out.println(sum);
    }
}

執行一下輸出結果為13

嗯,Perfect!

總結

本文主要介紹如何使用位運算來實現加減功能,至此功能都已經實現了。

那麼問題來了,我們實現的加減運算與Java本身的加減相比,誰的效率更高呢?當然是Java中的更高了,因為我們是用Java實現的,程式碼執行後,要經過層層的翻譯才能到達底層,所以效率肯定是有損失的。

當然我們的目的是熟悉位運算的操作,這個才是最重要的。

到此這篇關於Java利用位運算實現加減運算詳解的文章就介紹到這了,更多相關Java位運算實現加減運算內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com