1. 记数组中存在的唯一的两个数字分别为a,b
  2. 首先以二进制的角度去看所有的数字,每一位均为0,1组成
  3. 对所有数字进行个位上的异或,成对相同的数字结果为0,每一位上都这样异或依次,所以最终每一位上存在1的则必然是因为a,b在这一位上不同
  4. 根据最终结果上存在‘1’的这一位,将原数组分为两组,一组‘1’,一组‘0‘,
  5. 两组数字再分别异或,最终两个结果就是a,b;
class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        int num=0;

        for(int i=0;i < data.size();i++){
            num^=data[i];//所有数异或,结果为不同的两个数字的异或
        }

        int count=0;//标志位,记录num中的第一个1出现的位置
        for(;count < data.size();count++){
            if((num&(1<<count))!=0){
                break;
            }
        }

        int num_1 = 0;
        int num_2 = 0;

        for(int i=0; i < data.size(); i++){

            if((data[i]&(1<<count))==0){//标志位为0的为一组,异或后必得到一个数字(这里注意==的优先级高于&,需在前面加())
                num_1^=data[i];
            }else{
                num_2^=data[i];//标志位为1的为一组
            }
        }
        *num1 = num_1;
        *num2 = num_2;
    }
};