亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java利用位運算實現(xiàn)加減運算詳解

 更新時間:2022年12月31日 09:34:46   作者:JavaCub  
這篇文章主要為大家介紹了如何使用位運算來實現(xiàn)加減功能,也就是在整個運算過程中不能出現(xiàn)加減符號。文中的示例代碼講解詳細,感興趣的可以了解一下

前言

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

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

思路分析

先分析如何用位運算實現(xiàn)加法運算。

示例

假設(shè)a=23,b=36,使用位運算實現(xiàn)加法得到結(jié)果59。

首先來看下2336、59的二進制信息。

從上面的圖中可以看到,兩個數(shù)相加的結(jié)果與兩個數(shù)異或的結(jié)果很相似,只不過在圖中的2位置相加的時候,產(chǎn)生了進位,而異或是沒有進位的,如果能拿到進位信息,把兩個數(shù)異或的結(jié)果和進位信息的結(jié)果相加就能得到最終結(jié)果了,那么如果能拿到進位信息呢?

位運算進位

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

于是,我們可以得出,兩個數(shù)的二進制進位信息為兩個數(shù)的相與在左移一位。

初步結(jié)果

經(jīng)過上面的分析,我們可以得到了一個初步的運算結(jié)果,即兩個數(shù)相加等于兩個數(shù)異或加上兩個數(shù)的相與左移1位,也就是a + b = (a ^ b) + ((a & b) << 1)。

先用2336來驗證下。

經(jīng)過驗證可以看到,剛才得出的結(jié)論是正確的。

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

去除加號

還是以2336為例,經(jīng)過上面的運算我們把運算的位運算結(jié)果給化簡下。

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

也就是把2336的相加運算轉(zhuǎn)化為了518的相加運算,接下來繼續(xù)分析518的相加運算,也是通過異或和相與進行操作。

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

嗯?可以發(fā)現(xiàn)我們已經(jīng)得出59了,而且還加了個0,加了個0不就相當(dāng)于加了個寂寞嘛,可以直接省略啊。

由此,我們又可以得出一個結(jié)論,兩個數(shù)的二進制進位信息為兩個數(shù)的相與在左移一位,不停地循環(huán)這個過程,直到有一個數(shù)變?yōu)?,就能得到結(jié)果。

整體思路

現(xiàn)在來總結(jié)下整體的計算過程:

  • 把兩個數(shù)相加,拆分成兩步,兩個數(shù)異或加上兩個數(shù)相與左移1位。
  • 判斷相與左移的結(jié)果是否為0。
  • 如果相與左移為0,兩個數(shù)異或的結(jié)果即為相加的結(jié)果。
  • 如果相與左移結(jié)果不為0,把得到的新結(jié)果,重復(fù)執(zhí)行第1~3步操作。

加法代碼實現(xiàn)

經(jīng)過上面的分析,來看下代碼實現(xiàn)。

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);
    }
}

運行程序,輸出結(jié)果為59。

減法實現(xiàn)

減法分析

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

36 - 23 不就相當(dāng)于36 + (-23),可以理解為加上一個負數(shù),這就可以了嗎?不不不,要求的是不能出現(xiàn)加減符號,-23里面是有減法這個符號的。

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

減法代碼實現(xiàn)

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

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);
    }
}

運行一下輸出結(jié)果為13。

嗯,Perfect!

總結(jié)

本文主要介紹如何使用位運算來實現(xiàn)加減功能,至此功能都已經(jīng)實現(xiàn)了。

那么問題來了,我們實現(xiàn)的加減運算與Java本身的加減相比,誰的效率更高呢?當(dāng)然是Java中的更高了,因為我們是用Java實現(xiàn)的,代碼運行后,要經(jīng)過層層的翻譯才能到達底層,所以效率肯定是有損失的。

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

到此這篇關(guān)于Java利用位運算實現(xiàn)加減運算詳解的文章就介紹到這了,更多相關(guān)Java位運算實現(xiàn)加減運算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Intellij IDEA中.properties文件中文顯示亂碼問題的解決

    詳解Intellij IDEA中.properties文件中文顯示亂碼問題的解決

    這篇文章主要介紹了詳解Intellij IDEA中.properties文件中文顯示亂碼問題的解決,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • java正則表達式匹配規(guī)則超詳細總結(jié)

    java正則表達式匹配規(guī)則超詳細總結(jié)

    正則表達式并不僅限于某一種語言,但是在每種語言中有細微的差別,下面這篇文章主要給大家介紹了關(guān)于java正則表達式匹配規(guī)則的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • Mybatis中BindingException異常的產(chǎn)生原因及解決過程

    Mybatis中BindingException異常的產(chǎn)生原因及解決過程

    BindingException異常是MyBatis框架中自定義的異常,顧名思義指的是綁定出現(xiàn)問題,下面這篇文章主要給大家介紹了關(guān)于MyBatis報錯BindingException異常的產(chǎn)生原因及解決過程,需要的朋友可以參考下
    2023-06-06
  • SpringBoot整合Redis實現(xiàn)刷票過濾功能

    SpringBoot整合Redis實現(xiàn)刷票過濾功能

    隨著互聯(lián)網(wǎng)的不斷發(fā)展,網(wǎng)站或APP的用戶流量增加,也衍生出了一些惡意刷量等問題,給數(shù)據(jù)分析及運營帶來極大的困難,所以本文使用SpringBoot和Redis實現(xiàn)一個刷票過濾功能,需要的可以參考一下
    2023-06-06
  • JavaWeb利用郵箱幫用戶找回密碼

    JavaWeb利用郵箱幫用戶找回密碼

    這篇文章主要為大家詳細介紹了JavaWeb利用郵箱幫用戶找回密碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 教你實現(xiàn)Java接口防刷

    教你實現(xiàn)Java接口防刷

    有些人會惡意提交,本文主要介紹了教你實現(xiàn)Java接口防刷,通過在一定時間內(nèi)限制同一用戶對同一個接口的請求次數(shù),具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • java多線程之Future和FutureTask使用實例

    java多線程之Future和FutureTask使用實例

    這篇文章主要介紹了java多線程之Future和FutureTask使用實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • spring boot springMVC擴展配置實現(xiàn)解析

    spring boot springMVC擴展配置實現(xiàn)解析

    這篇文章主要介紹了spring boot springMVC擴展配置實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • java中set接口使用方法詳解

    java中set接口使用方法詳解

    這篇文章主要為大家詳細介紹了java中set接口使用方法,介紹了Java中Set集合接口實現(xiàn)插入對象不重復(fù)的原理,感興趣的小伙伴們可以參考一下
    2016-05-05
  • SpringBoot前后端分離實現(xiàn)個人博客系統(tǒng)

    SpringBoot前后端分離實現(xiàn)個人博客系統(tǒng)

    這篇文章主要為大家詳細介紹了使用springboot+mybatis+前端vue,使用前后端分離架構(gòu)實現(xiàn)的個人博客系統(tǒng),感興趣的小伙伴可以動手嘗試一下
    2022-06-06

最新評論