位运算,一个数和它本身做异或运算结果为 0,即 a ^ a = 0;一个数和 0 做异或运算的结果为它本身,即 a ^ 0 = a。
中途需要划分A,B所在得组

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        vector<int> res;
        if(!array.size()){
            return res;
        }

        int middle = 0;
        for(int n:array){
            middle ^= n;
        }

        int compare =1;
        while((compare &middle)==0){ //判断异或结果的二进制第一位是否为1,为1则直接跳过该循环
            compare <<=1;//为0则继续往后找,一直到找到为1的二进制位,该行代码也相当于compare *=2
        }


        int a = 0;
        int b = 0;

        for(int n:array){ //遍历数组,开始判断数字们的compare位是否为1
           if((compare&n)==0){//如果该数字二进制的第某位为0,则分到数组一
               a^=n; //对数组一进行异或,得到a
           }else{  //如果该数字二进制的第某位为1,则分到数组二 
               b^=n; //对数组二进行异或,得到b
           }
        }

        res.emplace_back(a>b?b:a);
        res.emplace_back(a>b?a:b);


        return res;
    }
};