1. 程式人生 > >位運算 -- 只出現一次的的數字

位運算 -- 只出現一次的的數字

異或的兩個值'相同為假,不同為真'。

交換兩個整數的值時可以不用第三個引數
a = a ^ b ^ a = b
b = b ^ a ^ b = a
一個只出現一次的數字。

一個整型數組裡除了一個數字之外,其他的數字都出現了偶數次。請寫程式找出這個只出現一次的數字。

public int oneNumsAppearOnce(int [] array ){
    int num = 0;
    if(array.length>0){
        for(int i = 0; i<array.length; i++){
            num ^= array[i];
        }
    }
    return num;
}
兩個只出現一次的數字。

先舉出一個數組:{5,3,2,1,2,5}
最終異或結果:1^3 = 0010
那麼第二位是1,則說明兩個單獨出現的數的第二位不同;
那麼我們可以根據這個條件對陣列進行分組:第二位為1的為一組,第二位為0的為一組;然後每一組進行異或,
得到的兩個結果就是單獨出現的倆個數!

//num1,num2分別為長度為1的陣列 將num1[0],num2[0]設定為返回結果
public void twoNumsAppearOnce(int [] array,int num1[] , int num2[]) {
    int num = 0;
    if(array.length>0){
        int index = 0 ;
        num1[0] = 0;
        num2[0] = 0;
        for(int i = 0; i<array.length; i++){
            num ^= array[i];
        }
        for(int i = 0; i<32; i++){
            if( ( (num >> i) & 1 ) == 1 ){ //右移 找到第一個為1的位;
                index = i;
                break;
            }
        }
        for(int j = 0; j<array.length; j++){
            if( ((array[j] >> index) & 1 ) == 1){
                num1[0] ^= array[j];
            }else {
                num2[0] ^= array[j];
            }
        }
    }
    System.out.println(""+num1[0] + "+" + num2[0] + "");
}