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

Java利用位運算實現(xiàn)加減乘除的方法詳解

 更新時間:2022年08月29日 15:29:08   作者:熬夜磕代碼丶  
我們經(jīng)常使用的加減乘除,我們所看到的只是表面的效果,那么加減乘除在底層究竟是怎么實現(xiàn)的?今天就讓我們一探究竟

前言

我們經(jīng)常使用的加減乘除,我們所看到的只是表面的效果,那么加減乘除在底層究竟是怎么實現(xiàn)的?今天就讓我們一探究竟.今天用位運算實現(xiàn)的加減乘除不使用任何的加減乘除符號.

一、常見位運算

1. &運算

&運算二進(jìn)制每一位全1為1,否則為0

public static void main(String[] args) {
        int a = 1;
        int b = 3;
        System.out.println(a & b);
    }

2. |運算

|運算二進(jìn)制每一位有1為1,全0為0

public static void main(String[] args) {
        int a = 1;
        int b = 3;
        System.out.println(a | b);
    }

3. ^運算

^運算二進(jìn)制每一位不同為1,相同為0

public static void main(String[] args) {
        int a = 1;
        int b = 3;
        System.out.println(a ^ b);
    }

4. ~運算

~運算是二進(jìn)制每一位按位取反.

public static void main(String[] args) {
        int a = 1;
        System.out.println(~a);
    }

二、位運算實現(xiàn)加法

public static void main(String[] args) {
        int a = 1;
        int b = 3;
        System.out.println(a + b);
    }

下來我們用位運算實現(xiàn)一下加法.

我們進(jìn)行一次異或運算就相當(dāng)于進(jìn)行一次無進(jìn)位加法,那這樣也不能實現(xiàn)加法,那我們得想辦法,實現(xiàn)進(jìn)位的數(shù)值.

進(jìn)行一次與運算,只有同時為1才為1,也當(dāng)同時為1時,我們需要進(jìn)位,所以我們進(jìn)行與運算后進(jìn)行左移一位的操作,即可得到進(jìn)位后的數(shù)值.

我們對異或運算和與運算后左移一位的結(jié)果進(jìn)行相加即可,但我們只能進(jìn)行位運算,所以我們只能再次進(jìn)行異或運算與與運算,直到云運算的結(jié)果為0時,我們的異或運算的結(jié)果即為加法的結(jié)果.

public static int bitAdd(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) {
        System.out.println(bitAdd(1,2));
    }

三、位運算實現(xiàn)減法

public static void main(String[] args) {
        int a = 1;
        int b = 3;
        System.out.println(a - b);
    }

下來我們用位運算實現(xiàn)一下減法.

在我們有了位運算實現(xiàn)加法的基礎(chǔ)之后,我們的減法就變得簡單了,a - b == a + ( -b ),所以我們只需要將b變?yōu)?b即可實現(xiàn)減法功能,但我們不能使用負(fù)號,那我們來用位運算來實現(xiàn)一下.

public static void main(String[] args) {
        System.out.println(~3);
    }

我們可以發(fā)現(xiàn)一個數(shù)取反與相反數(shù)差一,我們?nèi)》醇右患纯傻玫较喾磾?shù).

public static void main(String[] args) {
        System.out.println(~3 + 1);
    }

public static int bitAdd(int a,int b) {
        int sum = 0;
        while(b != 0) {
            sum = a ^ b;
            b = (a & b) << 1;
            a = sum;
        }
        return sum;
    }

    public static int bitSub(int a,int b) {
        return bitAdd(a,~b+1);
    }

    public static void main(String[] args) {
        System.out.println(bitSub(1,3));
    }

四、位運算實現(xiàn)乘法

public static void main(String[] args) {
        int a = 1;
        int b = 3;
        System.out.println(a * b);
    }

我們小學(xué)的時候是怎么進(jìn)行乘法的,按位相乘,每一位和每一位相乘.

二進(jìn)制中也是一樣的,按位相乘,如果被乘數(shù)二進(jìn)制位是1則與乘數(shù)相乘.每次運算進(jìn)行移位

public static int bitAdd(int a,int b) {
        int sum = 0;
        while(b != 0) {
            sum = a ^ b;
            b = (a & b) << 1;
            a = sum;
        }
        return sum;
    }
    public static int bitMul(int a,int b) {
        int sum = 0;
        while(b != 0) {
            if((b & 1) != 0) {
                sum += a;
            }
            a <<= 1;
            b >>>= 1;
        }
        return sum;
    }

    public static void main(String[] args) {
        System.out.println(bitMul(1,3));
    }

五、位運算實現(xiàn)除法

public static void main(String[] args) {
        int a = 7;
        int b = 2;
        System.out.println(a / b);
    }

我們在用位運算實現(xiàn)除法時,采用逆推的方式,a / b = c,

a = c * b。

我們只需要求出a減去b向左的移位,只要滿足a <= b的移位即可,每次移動多少位即a / b的結(jié)果二進(jìn)制中某一位為1,以此循環(huán)倒推即可.

public static int bitAdd(int a,int b) {
        int sum = 0;
        while(b != 0) {
            sum = a ^ b;
            b = (a & b) << 1;
            a = sum;
        }
        return sum;
    }
    public static int negNum(int n) {
        //轉(zhuǎn)化為相反數(shù)
        return bitAdd(~n,1);
    }
    public static int minus(int a,int b) {
        //實現(xiàn)兩個數(shù)相減
        return bitAdd(a,negNum(b));
    }
    public static boolean isNeg(int n) {
        //判斷是否為負(fù)數(shù)
        return n < 0;
    }
    public static int bitDiv(int a,int b) {
        int x = isNeg(a) ? negNum(a) : a;
        int y = isNeg(b) ? negNum(b) : b;
        int res = 0;
        for (int i = 30; i >= 0 ; i = minus(i,1)) {
            if((x >> i) >= y) {
                res |= (1 << i);
                x = minus(x,y << i);
            }
        }
        return isNeg(a) != isNeg(b) ? negNum(res) : res;

    }

    public static void main(String[] args) {
        int a = 7;
        int b = 2;
        System.out.println(bitDiv(a,b));
    }

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

相關(guān)文章

  • Java簡單實現(xiàn)動態(tài)代理模式過程解析

    Java簡單實現(xiàn)動態(tài)代理模式過程解析

    這篇文章主要介紹了Java動態(tài)代理模式簡單案例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java spring AOP基礎(chǔ)

    Java spring AOP基礎(chǔ)

    本篇文章主要介紹了深入理解spring的AOP機制基礎(chǔ)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11
  • Java中Arrays.sort()方法的比較器詳解

    Java中Arrays.sort()方法的比較器詳解

    這篇文章主要介紹了Java中Arrays.sort()方法的比較器詳解,Arrays.sort(Object[] a)此方法看似沒有要求我們實現(xiàn)比較器,對于基本數(shù)據(jù)類型,String類型確實如此,因為這些類型中已經(jīng)自帶了compareTo()方法,需要的朋友可以參考下
    2023-12-12
  • Spring5中SpringWebContext方法過時的解決方案

    Spring5中SpringWebContext方法過時的解決方案

    這篇文章主要介紹了Spring5中SpringWebContext方法過時的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • idea中maven使用tomcat7插件運行run報錯Could not start Tomcat問題

    idea中maven使用tomcat7插件運行run報錯Could not start T

    這篇文章主要介紹了idea中maven使用tomcat7插件運行run報錯Could not start Tomcat問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Java中的自動裝箱與自動拆箱的實現(xiàn)

    Java中的自動裝箱與自動拆箱的實現(xiàn)

    自動裝箱和自動拆箱使得我們在使用基本數(shù)據(jù)類型時更加方便,同時也提高了代碼的可讀性和健壯性,本文將詳細(xì)介紹Java中的自動裝箱和自動拆箱機制,感興趣的可以了解一下
    2023-08-08
  • MyBatis的SQL執(zhí)行結(jié)果和客戶端執(zhí)行結(jié)果不一致問題排查

    MyBatis的SQL執(zhí)行結(jié)果和客戶端執(zhí)行結(jié)果不一致問題排查

    本文主要介紹了MyBatis的SQL執(zhí)行結(jié)果和客戶端執(zhí)行結(jié)果不一致問題排查,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Spring AI源碼分析流式回答(最新推薦)

    Spring AI源碼分析流式回答(最新推薦)

    本文我們將重點講解流式響應(yīng)的概念與實現(xiàn),畢竟,AI的流式回答功能與其交互體驗密切相關(guān),是提升用戶滿意度的重要組成部分,我們將通過代碼示例來展示這一過程,幫助您更清晰地理解如何在實際應(yīng)用中進(jìn)行操作,感興趣的朋友一起看看吧
    2024-11-11
  • Java中處理郵件附件的方法(本地文件和在線URL)

    Java中處理郵件附件的方法(本地文件和在線URL)

    這篇文章主要介紹了在Java中處理郵件附件的方法,針對本地文件和在線URL兩種附件來源,提供了兩種解決方案,并提供了下載文件和發(fā)送郵件的代碼示例,需要的朋友可以參考下
    2025-03-03
  • Spring?Boot?DevTools?全局配置學(xué)習(xí)指南

    Spring?Boot?DevTools?全局配置學(xué)習(xí)指南

    這篇文章主要介紹了Spring?Boot?DevTools?全局配置,注意包括直接重啟項目與devtools重啟的區(qū)別,DevTools配置,DevTools全局配置及trigger-file控制重啟行為的相關(guān)知識,需要的朋友可以參考下
    2022-03-03

最新評論

竹山县| 广西| 舒城县| 寿宁县| 大邑县| 上饶县| 洛川县| 青岛市| 天峨县| 龙胜| 重庆市| 绥宁县| 疏勒县| 崇信县| 奉节县| 甘肃省| 垣曲县| 华蓥市| 剑阁县| 炎陵县| 南开区| 固原市| 麻城市| 嘉禾县| 舞阳县| 临江市| 同仁县| 青铜峡市| 农安县| 曲松县| 吉水县| 平阳县| 略阳县| 凤阳县| 乐昌市| 平乐县| 克什克腾旗| 龙泉市| 泗水县| 阿克苏市| 海丰县|