国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java-異或運(yùn)算詳解

這篇具有很好參考價(jià)值的文章主要介紹了Java-異或運(yùn)算詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

基本概念

異或運(yùn)算,符號(hào)為XOR或者^(guò),是二進(jìn)制的運(yùn)算,運(yùn)算法則為相同為0,不同為1,我記得時(shí)候反正總會(huì)忘(和同或記反),所以這里直接把異或理解為"不進(jìn)位的二進(jìn)制相加".舉個(gè)栗子:

1000111 和 1110001 異或

按照不進(jìn)位相加的運(yùn)算方法:最小位都是1 相加為2也就是10(二進(jìn)制運(yùn)算), 因?yàn)槭遣贿M(jìn)位的運(yùn)算 所以直接本位為0 就可以了,其他位如法炮制:0110110.

重要性質(zhì)

異或運(yùn)算符合交換律和結(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)用場(chǎng)景

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

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

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

這三個(gè)a^b你懵不懵?反正我第一次看見(jiàn)是挺懵的

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

a = x^y

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

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

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

值得一提的是因?yàn)楫惢虿僮鞯男再|(zhì),如果a和b是同一塊內(nèi)存的話 會(huì)導(dǎo)致最后交換結(jié)果為0

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

這題用性質(zhì)做爽的一匹,直接把他們?nèi)籍惢蛟谝黄鹁托辛?根據(jù)結(jié)合律,出現(xiàn)偶數(shù)個(gè)的數(shù)全都異或在一起變成零,而奇數(shù)個(gè)數(shù)的數(shù)異或在一起會(huì)剩下一個(gè),然后本身和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.取一個(gè)二進(jìn)制數(shù)中的最后一個(gè)1

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

我們先設(shè)N是一個(gè)二進(jì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進(jìn)行按位與(&)操作

得到 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));//按二進(jìn)制打印n
        int a = selectlastone(n);
        System.out.println(Integer.toBinaryString(a));//按二進(jìn)制打印a
}

4.一個(gè)數(shù)組中有兩個(gè)數(shù)出現(xiàn)了奇數(shù)次,其他數(shù)都出現(xiàn)了偶數(shù)次,找到并打印這個(gè)數(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是其中一個(gè)
            return eor ^ onlyOne;//返回的是另一個(gè)
    }

    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è)這兩個(gè)單獨(dú)的數(shù)分別為a b

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

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

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

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

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

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

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

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

5.求二進(jìn)制數(shù)中有多少個(gè)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輕松解決文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-467084.html

到了這里,關(guān)于Java-異或運(yùn)算詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 異或運(yùn)算在算法中的神奇應(yīng)用

    兩個(gè)二進(jìn)制數(shù)進(jìn)行異或運(yùn)算時(shí),每一位上的數(shù)相同則結(jié)果為0,不同則結(jié)果為1。 簡(jiǎn)單記:異或就是二進(jìn)制的無(wú)進(jìn)位相加。 還有個(gè)同或運(yùn)算:相同為1,不同為0,和異或是反的。 任何數(shù)與0異或,結(jié)果還是這個(gè)數(shù):0^n=n 任何數(shù)與自身異或,結(jié)果都是0:n^n=0 異或運(yùn)算滿足交換律和

    2024年04月08日
    瀏覽(19)
  • 位運(yùn)算(按位與、按位或、異或、取反)以及原碼、反碼、補(bǔ)碼

    位運(yùn)算(按位與、按位或、異或、取反)以及原碼、反碼、補(bǔ)碼

    目錄 位運(yùn)算 按位與運(yùn)算符 [ ] 按位或運(yùn)算符 [ | ] 異或運(yùn)算符 [ ^ ] 取反運(yùn)算符 [ ~ ] 移位操作 一些面試??嫉奈徊僮鬟\(yùn)算 獲取二進(jìn)制中最右邊的1 計(jì)算機(jī)原碼、反碼、補(bǔ)碼 機(jī)器數(shù) “三碼”之間的轉(zhuǎn)換 計(jì)算機(jī)中為啥要用補(bǔ)碼呢? 真數(shù) 原碼 反碼 補(bǔ)碼 有了原碼為什么要使用反碼

    2024年02月02日
    瀏覽(17)
  • C語(yǔ)言:位運(yùn)算符----與(&),或(|),非(~),異或(^),左移(<<)和右移(>>)

    C語(yǔ)言:位運(yùn)算符----與(&),或(|),非(~),異或(^),左移(<<)和右移(>>)

    C語(yǔ)言 基礎(chǔ)開(kāi)發(fā)----目錄 位運(yùn)算符 就是按二進(jìn)制位進(jìn)行運(yùn)算。 C語(yǔ)言中位運(yùn)算符主要包括六種,具體如下: 與(),或(|),非(~),異或(^),左移()和右移() 位運(yùn)算符 含義 說(shuō)明 按位 與 有0為0,雙1為1: 11=1,10=0,01=0,00=0 只有兩者對(duì)應(yīng)位都為 1 ,結(jié)果對(duì)應(yīng)位才為 1 ,否則為 0 I 按

    2024年01月18日
    瀏覽(21)
  • C#的幾種位操作運(yùn)算,與、或、非、異或、左移、右移

    C#的幾種位操作運(yùn)算,與、或、非、異或、左移、右移

    C#的常見(jiàn)幾種位操作運(yùn)算,與($)、或(|)、非(~)、異或(^)、左移()、右移() 位操作一般來(lái)說(shuō)比加減乘除計(jì)算要快一些 與()操作符的位都為1時(shí),才為1,其他都為0,因此與()操作符的結(jié)果范圍在[0, Math.Min(x,y)],x,y均為正整數(shù) 或(|)操作符的位都為0時(shí),才為0,其他都為1,因此或(|)操作

    2024年02月16日
    瀏覽(14)
  • 位運(yùn)算:按位與、按位或、按位異或、按位左移、按位右移

    位運(yùn)算:按位與、按位或、按位異或、按位左移、按位右移

    目錄 一、基礎(chǔ)知識(shí)補(bǔ)充 ? ? (1)位運(yùn)算 ? ? (2)二進(jìn)制的詳細(xì)操作 二、位運(yùn)算 ? ? (1)按位與() ? ? (2)按位或(|) ? ? (3)按位異或(^) ? ? ? (4)按位左移() ? ? (5)按位右移() 三、位運(yùn)算例題 ? ? 題目描述: ? ? 題解: 四、共勉 ? ? 位運(yùn)算符要比一般

    2024年02月03日
    瀏覽(26)
  • 【動(dòng)態(tài)規(guī)劃】【位運(yùn)算】1787. 使所有區(qū)間的異或結(jié)果為零

    【動(dòng)態(tài)規(guī)劃】【位運(yùn)算】1787. 使所有區(qū)間的異或結(jié)果為零

    【數(shù)位dp】【動(dòng)態(tài)規(guī)劃】【狀態(tài)壓縮】【推薦】1012. 至少有 1 位重復(fù)的數(shù)字 動(dòng)態(tài)規(guī)劃匯總 位運(yùn)算 給你一個(gè)整數(shù)數(shù)組 nums??? 和一個(gè)整數(shù) k????? 。區(qū)間 [left, right](left = right)的 異或結(jié)果 是對(duì)下標(biāo)位于 left 和 right(包括 left 和 right )之間所有元素進(jìn)行 XOR 運(yùn)算的結(jié)果

    2024年03月17日
    瀏覽(27)
  • 計(jì)算機(jī)中的邏輯運(yùn)算(與、或、非、異或、同或、與非、或非)

    計(jì)算機(jī)中的邏輯運(yùn)算(與、或、非、異或、同或、與非、或非)

    計(jì)算機(jī)中的邏輯運(yùn)算又被稱作為“布爾運(yùn)算”,分別為: 與 、 或 , 非 , 異或 。此外在門(mén)電路中還有: 同或 、 與非 、 或非 。共七種。 這七種邏輯運(yùn)算中,只有 邏輯非運(yùn)算 是一元邏輯運(yùn)算(一個(gè)運(yùn)算操作數(shù)),其他六種均是二元邏輯運(yùn)算(兩個(gè)運(yùn)算操作數(shù))。 邏輯運(yùn)

    2024年02月08日
    瀏覽(20)
  • WAF攻防-權(quán)限控制&代碼免殺&異或運(yùn)算&變量覆蓋&混淆加密&傳參

    webshell檢測(cè)平臺(tái) https://scanner.baidu.com/#/pages/intro https://ti.aliyun.com/#/webshell 對(duì)比工具代碼-菜刀蟻劍冰蝎哥斯拉等 對(duì)比WAF規(guī)則-函數(shù)匹配工具指紋等 1.php 傳參帶入 ?a=ass x=cGhwaW5mbygpOw== 2.php 變量覆蓋 x=cGhwaW5mbygpOw== 3.php 加密變異 http://www.phpjm.net/ 4.php 異或運(yùn)算 5.php 腳本生成器 Webshel

    2023年04月11日
    瀏覽(18)
  • JAVA----基本類型與運(yùn)算

    目錄 一、Java提供了哪些基本數(shù)據(jù)類型? 二、在Java語(yǔ)言中null值是什么?在內(nèi)存中null是什么? 三、如何理解賦值語(yǔ)句String x=null? 四、int和Integer有什么區(qū)別? 五、什么是不可變類 六、在Java語(yǔ)言中,類型轉(zhuǎn)換有哪幾種類型? (1)類型自動(dòng)轉(zhuǎn)換 (2)強(qiáng)制類型轉(zhuǎn)換 七、 強(qiáng)制

    2024年02月16日
    瀏覽(23)
  • TCP/IP詳解——網(wǎng)絡(luò)基本概念

    TCP/IP詳解——網(wǎng)絡(luò)基本概念

    網(wǎng)絡(luò)最開(kāi)始是為了數(shù)據(jù)通信。 以前通過(guò)ARPA網(wǎng)絡(luò),衛(wèi)星來(lái)實(shí)現(xiàn)幾個(gè)計(jì)算機(jī)的互相通信。 IBM推出自己的網(wǎng)絡(luò)協(xié)議,這時(shí)網(wǎng)絡(luò)沒(méi)有標(biāo)準(zhǔn)。 1977年:TCP/IP標(biāo)準(zhǔn)。 1980年:ARPAnet全面向TCP/IP遷移。 1984年:ISO-網(wǎng)絡(luò)標(biāo)準(zhǔn),國(guó)籍標(biāo)準(zhǔn)化組織機(jī)構(gòu)-定制各行各業(yè)的標(biāo)準(zhǔn)。 OSI開(kāi)放式系統(tǒng)互聯(lián),同時(shí)

    2024年02月05日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包