認識異或運算


異或運算:相同為0,不同為1
同或運算:相同以1,不同為0

異或運算就記成無進位相加!

1)0^N == N   N^N == 0
2)異或運算滿足交換律和結合率

題目一

如何不用額外變量交換兩個數

   /**
     * a 與 b 交換數據 不使用中間變量
     */
    public static void m1(){
        int a=5;
        int b=10;
        a=a^b;   //5^10
        b=a^b;   //5^10^10===>5
        a=a^b;   //5^10^5 ===>10
    }

 題目二  

 一個數組中有一種數出現了奇數次,其他數都出現了偶數次,怎么找到並打印這種數

/**
 * 數組中只有一個數出現奇數次 其他的是偶數次 找出這個數
 */
public static int m2(int []arr){
    int eur=0;
    for (int a:arr){
        eur^=a;
    }
    return eur;
}

題目三

怎么把一個int類型的數,提取出最右側的1來

eur&((~eur)+1)

解釋:例如一個數是 0001 0001 0011

          取反               1110  1110 1100

           加1                1110 1110 1101

          eur做與操作   0000 0000 0001

題目四
一個數組中有兩種數出現了奇數次,其他數都出現了偶數次,怎么找到並打印這兩種數 

/**
 * 數組中有兩個數出現奇數次 其他的是偶數次 找出這兩個數
 */
public static void m3(int []arr){
    int eur=0;
    for (int a:arr){
        eur^=a;
    }
    int rigthOne=eur&(~eur+1); //找出右邊第一個1
    int one=0;
    
    //整個數組分成兩個部分 1個部分是在rigthOne位置是1  1個部分是0 所以將兩個奇數次的數分開
    for (int i=0;i<arr.length;i++){
        if ((arr[i]&rigthOne)!=0){
            one^=arr[i];
        }
    }
    int two=eur^one;
    System.out.println("這兩個數是"+one+two);
}
題目五
如何計算一個數中有幾個1
public static void m4(int arr){
int count=0;
while(arr!=0){
int rigthOne=arr&((~arr)+1); //找出右邊第一個1
count++;
arr=arr^rigthOne; //還原 統計過的1 變成0
}
System.out.println(count);
}


免責聲明!

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



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