//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
//任何一个数字异或本身都为0
//全部异或,剩余的为两个出现一次的数字的异或,找这个数字中的1出现的位置,即为两个数字不同的地方
//按照这个位置将array分为两个数组,其中num1[]和num2[]分别在两个数组中
//两边再次全部异或,剩下的即为所求
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        if(array == null && array.length < 2){
            return;
        }
        int allOR = 0;
        for(int i = 0;i < array.length;i++){
            allOR ^= array[i];
        }
        int place1 = findPlace1(allOR);
        for(int j = 0;j < array.length;j++){
            if(binaryArr(array[j], place1)){
                num1[0] ^= array[j];
            }else{
                num2[0] ^= array[j];
            }
        }
    }
    
    public int findPlace1(int allOR){//求两个只出现一次数字异或之后的1的位置
        int place1 = 0;
        while((allOR & 1) != 1 &&place1 < 4*8){
            allOR = allOR >> 1;
            ++place1;
        }
        return place1;
    }
    
    public boolean binaryArr(int num, int place1){
        num = num >> place1;
        return (num & 1) == 1;
        }
    }