最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

本文主要介紹如何使用位運(yùn)算來(lái)實(shí)現(xiàn)加減功能,也就是在整個(gè)運(yùn)算過(guò)程中不能出現(xiàn)加減符號(hào)。

加減乘除運(yùn)算在計(jì)算機(jī)中,實(shí)際上都是用位運(yùn)算實(shí)現(xiàn)的,今天就用位運(yùn)算來(lái)模擬下加法和減法的運(yùn)算功能。

思路分析

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

示例

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

首先來(lái)看下23、36、59的二進(jìn)制信息。

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

位運(yùn)算進(jìn)位

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

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

初步結(jié)果

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

先用2336來(lái)驗(yàn)證下。

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

但是,我們要做到在整個(gè)運(yùn)算過(guò)程中不能出現(xiàn)加號(hào),接下來(lái)要想辦法把這個(gè)加號(hào)給去掉。

去除加號(hào)

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

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

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

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

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

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

整體思路

現(xiàn)在來(lái)總結(jié)下整體的計(jì)算過(guò)程:

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

加法代碼實(shí)現(xiàn)

經(jīng)過(guò)上面的分析,來(lái)看下代碼實(shí)現(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);
    }
}

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

減法實(shí)現(xiàn)

減法分析

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

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

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

減法代碼實(shí)現(xiàn)

有了加法操作,減法就很簡(jiǎn)單了,來(lái)看下代碼。

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

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

嗯,Perfect!

總結(jié)

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

那么問(wèn)題來(lái)了,我們實(shí)現(xiàn)的加減運(yùn)算與Java本身的加減相比,誰(shuí)的效率更高呢?當(dāng)然是Java中的更高了,因?yàn)槲覀兪怯肑ava實(shí)現(xiàn)的,代碼運(yùn)行后,要經(jīng)過(guò)層層的翻譯才能到達(dá)底層,所以效率肯定是有損失的。

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

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

相關(guān)文章

  • IDEA 中使用 ECJ 編譯出現(xiàn) java.lang.IllegalArgumentException的錯(cuò)誤問(wèn)題

    IDEA 中使用 ECJ 編譯出現(xiàn) java.lang.IllegalArgumentException的錯(cuò)誤問(wèn)題

    這篇文章主要介紹了IDEA 中使用 ECJ 編譯出現(xiàn) java.lang.IllegalArgumentException問(wèn)題 ,本文內(nèi)容簡(jiǎn)短給大家介紹的好,需要的朋友可以參考下
    2020-05-05
  • java 非常好用的反射框架Reflections介紹

    java 非常好用的反射框架Reflections介紹

    這篇文章主要介紹了java 反射框架Reflections的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Java使用FilenameFilter查找出目錄下指定后綴的文件示例

    Java使用FilenameFilter查找出目錄下指定后綴的文件示例

    這篇文章主要介紹了Java使用FilenameFilter查找出目錄下指定后綴的文件,結(jié)合實(shí)例形式分析了java基于FilenameFilter類的文件遍歷、查找相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • Java中的阻塞隊(duì)列BlockingQueue使用詳解

    Java中的阻塞隊(duì)列BlockingQueue使用詳解

    這篇文章主要介紹了Java中的阻塞隊(duì)列BlockingQueue使用詳解,阻塞隊(duì)列是一種線程安全的數(shù)據(jù)結(jié)構(gòu),用于在多線程環(huán)境下進(jìn)行數(shù)據(jù)交換,它提供了一種阻塞的機(jī)制,當(dāng)隊(duì)列為空時(shí),消費(fèi)者線程將被阻塞,直到隊(duì)列中有數(shù)據(jù)可供消費(fèi),需要的朋友可以參考下
    2023-10-10
  • SpringBoot中FailureAnalyzer的使用詳解

    SpringBoot中FailureAnalyzer的使用詳解

    這篇文章主要介紹了SpringBoot中FailureAnalyzer的使用詳解,FailureAnalyzer攔截啟動(dòng)時(shí)異常,將異常轉(zhuǎn)換成更加易讀的信息并包裝成org.springframework.boot.diagnostics.FailureAnalysis對(duì)象,監(jiān)控應(yīng)用啟動(dòng)過(guò)程,需要的朋友可以參考下
    2023-12-12
  • Java序列化常見(jiàn)實(shí)現(xiàn)方法代碼實(shí)例

    Java序列化常見(jiàn)實(shí)現(xiàn)方法代碼實(shí)例

    這篇文章主要介紹了Java序列化常見(jiàn)實(shí)現(xiàn)方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • intellij idea隱藏.iml和.idea等自動(dòng)生成文件的問(wèn)題

    intellij idea隱藏.iml和.idea等自動(dòng)生成文件的問(wèn)題

    這篇文章主要介紹了intellij idea隱藏.iml和.idea等自動(dòng)生成文件的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • spring中@Reference注入為空的解決方法

    spring中@Reference注入為空的解決方法

    今天上線遇到了問(wèn)題,所以抽空記錄一下,本文主要介紹了spring中@Reference注入為空的解決方法,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • SpringBoot與Angular2的集成示例

    SpringBoot與Angular2的集成示例

    本篇文章主要介紹了SpringBoot與Angular2的集成示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Java基于Socket的文件傳輸實(shí)現(xiàn)方法

    Java基于Socket的文件傳輸實(shí)現(xiàn)方法

    這篇文章主要介紹了Java基于Socket的文件傳輸實(shí)現(xiàn)方法,結(jié)合實(shí)例分析了Java使用Socket實(shí)現(xiàn)文件傳輸?shù)慕⑦B接、發(fā)送與接收消息、文件傳輸?shù)认嚓P(guān)技巧,需要的朋友可以參考下
    2015-12-12

最新評(píng)論

宜宾市| 墨脱县| 湛江市| 额尔古纳市| 金阳县| 精河县| 万年县| 公安县| 灵丘县| 邢台市| 阿拉善盟| 常德市| 洪雅县| 芒康县| 寻甸| 福清市| 深圳市| 宜城市| 惠东县| 大新县| 博爱县| 盐城市| 民权县| 永吉县| 临西县| 万盛区| 鞍山市| 宝鸡市| 安乡县| 页游| 垫江县| 铁岭市| 康定县| 巨鹿县| 汉川市| 汉沽区| 桦南县| 云安县| 梁河县| 惠安县| 石首市|