異或運算


一、異或運算(無進位運算)

  參加運算的兩個對象,按照二進制位進行異或運算,運算規則:0^0=0,0^1=1,1^1=0,相同為0,不同為1

  異或運算的性質:

  • 任何一個變量與0異或是其本身(N^0=N)
  • 任何一個變量與自身異或為0(N^N=0)
  • 異或運算滿足交換律和結合律

二、使用場景

  • 不使用額外變量,進行兩個變量值的交換,前提兩個變量不能指向同一個內存地址(在數組中使用必須考慮)
     
               
    public static void main(String[] args) {
    int a = 11;
    int b = 20;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    System.out.println("a: " + a + ", b: " + b);
    }

     

  • 一個數組中出現某個數出現奇數次,其余數字出現偶數次,找出奇數次的數字。(要求時間復雜度:O(n), 空間復雜度:O(1))

    public static int findOdd(int[] arr) throws Exception {
            if (arr == null) {
                throw new Exception("arr 不符合要求");
            }
            int eor = 0;
            for (int item : arr) {
                eor = eor ^ item;
            }
            return eor;
        }

     

  • 一個數組中出現某兩個數出現奇數次,其余數字出現偶數次,找出奇數次的數字
    public static void findOddNum2(int[] arr) {
            int eor = 0;
            for (int item : arr) {
                eor ^= item;  // 這里最終結果為 eor = a ^ b
            }
    
            // 由a != b, eor != 0 -> eor某一個位置上必然是1, 即 a, b必然有一個位置上是1和0
            // 取最右的1
            int rightOne = eor & (~eor + 1);
            int onlyOne = 0;
            for (int cur : arr) {
                if ((cur & rightOne) == 1) { // 說明cur相同位置為1
                    onlyOne ^= cur;
                }
            }
            System.out.println(onlyOne + "," + (eor ^ onlyOne));
        }

     

        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM