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

Java異或運算應(yīng)用場景詳解

 更新時間:2023年07月21日 10:28:29   作者:Java學(xué)會?工資翻倍  
這篇文章主要給大家介紹了關(guān)于Java異或運算應(yīng)用場景的相關(guān)資料,異或運算會應(yīng)用在很多算法題中,這里整理了幾個最常見的應(yīng)用場景,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下

基本概念

異或運算,符號為XOR或者^,是二進制的運算,運算法則為相同為0,不同為1,我記得時候反正總會忘(和同或記反),所以這里直接把異或理解為"不進位的二進制相加".舉個栗子:

1000111 和 1110001 異或

按照不進位相加的運算方法:最小位都是1 相加為2也就是10(二進制運算), 因為是不進位的運算 所以直接本位為0 就可以了,其他位如法炮制:0110110.

重要性質(zhì)

異或運算符合交換律和結(jié)合律

交換律:a^b^c^d 和 a^d^c^b是一樣的

結(jié)合律:a^b^c^d和a^(b^c)^d是一樣的

0^N==N

N^N==0

應(yīng)用場景

1.利用異或交換兩個數(shù)

絕大多數(shù)這個操作都是沒屁硌楞嗓子的無意義操作....它的好處就是不用申請額外空間完成操作,但是不用異或操作也可以實現(xiàn)不申請額外空間的交換(異或操作還有可能出錯)---不創(chuàng)建臨時變量交換兩個變量傳送門(可以看下這篇博客)

int a = 10;
int b = 11;
a = a^b;
b = a^b;
a = a^b;
System.out.println(a);
System.out.println(b);

這三個a^b你懵不懵?反正我第一次看見是挺懵的

設(shè) a的初始值為x b的初始值為y

a = x^y

b = (x^y)^y 因為y^y為0 x^0為x 所以b中現(xiàn)在存儲的數(shù)據(jù)為 x(交換完成)

a = x^y^x 同理 ==x

(寄!寫著寫著發(fā)現(xiàn)按值傳遞按址傳遞好不懸給忘了)

值得一提的是因為異或操作的性質(zhì),如果a和b是同一塊內(nèi)存的話 會導(dǎo)致最后交換結(jié)果為0

2.一個數(shù)組中有一個數(shù)出現(xiàn)了奇數(shù)次,其他數(shù)都出現(xiàn)了偶數(shù)次,找到并打印這個數(shù)

這題用性質(zhì)做爽的一匹,直接把他們?nèi)籍惢蛟谝黄鹁托辛?根據(jù)結(jié)合律,出現(xiàn)偶數(shù)個的數(shù)全都異或在一起變成零,而奇數(shù)個數(shù)的數(shù)異或在一起會剩下一個,然后本身和0異或還是本身;

    public static int select(int arr[]) {
        int sum = 0;
        for(int i = 0;i<arr.length;i++) {
            sum^=arr[i];
        }
        return sum;
    }
    public static void main(String[] args) {
        int [] arr = {1,1,1,1,3,3,3,3,3,5,5,5,5};
        int a = select(arr);
        System.out.println(a);
}

3.取一個二進制數(shù)中的最后一個1

如1001110 取得就是倒數(shù)第二個

我們先設(shè)N是一個二進制數(shù)

N: 1 0 0 0 1 1 1 1 1 1 1

~N: 0 1 1 1 0 0 0 0 0 0 0(取反)

~N+1:0 1 1 1 0 0 0 0 0 0 1

然后把N和~N+1進行按位與(&)操作

得到 0 0 0 0 0 0 0 0 0 0 1

public static int selectlastone(int n) {
        int n1 = ~n+1;
        int s = n&n1;
        return s;
    }
    public static void main(String[] args) {
        int n = 10;
        System.out.println(Integer.toBinaryString(n));//按二進制打印n
        int a = selectlastone(n);
        System.out.println(Integer.toBinaryString(a));//按二進制打印a
}

4.一個數(shù)組中有兩個數(shù)出現(xiàn)了奇數(shù)次,其他數(shù)都出現(xiàn)了偶數(shù)次,找到并打印這個數(shù)

public static int select(int[] arr) {
            int eor = 0;
            for (int i = 0; i < arr.length; i++) {
                eor ^= arr[i];
            }
            int rightOne = (~eor+1)&eor; // 提取出最右的1
            int onlyOne = 0; 
            for (int i = 0 ; i < arr.length;i++) {
                if ((arr[i] & rightOne) != 0) {
                    onlyOne ^= arr[i];
                }
            }
            System.out.println(onlyOne);//onlyOne是其中一個
            return eor ^ onlyOne;//返回的是另一個
    }
    public static void main(String[] args) {
        int [] arr= {1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4};
        int a = select(arr);
        System.out.println(a);
}

設(shè)這兩個單獨的數(shù)分別為a b

先把所有數(shù)字都異或在一起 偶數(shù)消除掉 留下的是 a^b

a和b至少有一位是不同的 所以a^b里面至少有一個1 我們?nèi)〕鲎笥疫叺? 得到rightone

a或者b不同的話 這個位置上肯定其中一個是 1 一個是 0;

我們假設(shè)a這個位置上是1 b這個位置上是0

(反正除了我們要找的數(shù)以外都是偶數(shù)個,剩下的那些本位置為1的數(shù)是0個還是6個8個都不重要)

可以把這個數(shù)組分為兩組 A組 這個位上為1的元素 B組 這個位上為0的元素

而在A組中 包含偶數(shù)個其他元素和奇數(shù)個a 所以再次轉(zhuǎn)變成問題2求出onlyone

然后再有a^b = eor a^eor = b 求出另一個元素

5.求二進制數(shù)中有多少個1

    public static int onecount(int a) {
            int count = 0;
            while(a!=0) {
                int rightone = ((~a)+1)&a;
                count++;
                a ^= rightone;
            }
            return count;
    }
    public static void main(String[] args) {
        int a = 55;
        int count = onecount(a);
        System.out.println(count);
}

用應(yīng)用3輕松解決

總結(jié)

到此這篇關(guān)于Java異或運算應(yīng)用場景詳解的文章就介紹到這了,更多相關(guān)Java異或運算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis的動態(tài)SQL以及連接池詳解

    mybatis的動態(tài)SQL以及連接池詳解

    這篇文章主要介紹了mybatis的動態(tài)SQL以及連接池詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java根據(jù)表達式獲取對象中的值及設(shè)置值的例子

    Java根據(jù)表達式獲取對象中的值及設(shè)置值的例子

    這篇文章主要介紹了Java根據(jù)表達式獲取對象中的值及設(shè)置值的例子,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-03-03
  • Java中類的定義和初始化示例詳解

    Java中類的定義和初始化示例詳解

    這篇文章主要給大家介紹了關(guān)于Java中類的定義和初始化的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • java FileWriter 追加文件及文件改名方式

    java FileWriter 追加文件及文件改名方式

    這篇文章主要介紹了java FileWriter 追加文件及文件改名的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • tomcat請求流程源碼解進階篇

    tomcat請求流程源碼解進階篇

    這篇文章主要為大家介紹了tomcat請求流程源碼解進階,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java?IDEA集成開發(fā)工具中英文切換圖文教程

    Java?IDEA集成開發(fā)工具中英文切換圖文教程

    相信很多小伙伴們剛接觸IDEA時,看到一堆英文界面不知道如何下手,這篇文章主要給大家介紹了關(guān)于Java?IDEA集成開發(fā)工具中英文切換的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • 如何判斷java是32位的還是64位的

    如何判斷java是32位的還是64位的

    這篇文章主要介紹了如何判斷java是32位的還是64位的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java線程間共享實現(xiàn)方法詳解

    Java線程間共享實現(xiàn)方法詳解

    這篇文章主要介紹了Java線程間共享實現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Java解析XML(4種方式)案例詳解

    Java解析XML(4種方式)案例詳解

    這篇文章主要介紹了Java解析XML(4種方式)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 總結(jié)Java調(diào)用Python程序方法

    總結(jié)Java調(diào)用Python程序方法

    這篇文章主要介紹了總結(jié)Java調(diào)用Python程序方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

霸州市| 万载县| 昌宁县| 陆川县| 元朗区| 兴安县| 康保县| 万州区| 大冶市| 大埔县| 龙井市| 中山市| 丰顺县| 开江县| 福安市| 盐边县| 曲麻莱县| 浮梁县| 澄江县| 泉州市| 肥西县| 宿州市| 灵山县| 长葛市| 富平县| 平遥县| 周宁县| 米泉市| 怀来县| 高尔夫| 绥江县| 中卫市| 阿拉尔市| 韶关市| 同德县| 上虞市| 东源县| 祁连县| 沁源县| 石嘴山市| 满洲里市|