class Solution {
// 注意位运算符优先级很低,每次把括号加上
// 如果只有一个数出现了1次,别的都两次,那么全员异或即可
// 两个的话必须分为两组,保证出现一次的数各在一组
// 以这两个数不相同的位来分。其他各出现两次的自动归入这两组。
// 然后两组各自异或即可
// 注意0^别的数还是别的数
public int[] singleNumbers(int[] nums) {
int n=0;
// 结果是两个只出现1次的数的结果
for(int temp:nums){
n^=temp;
}
int test=1;
while((test&n)==0){
test=test<<1;
}
int res1=0,res2=0;
for(int temp:nums){
if((temp&test)==0){
res1^=temp;
}else{
res2^=temp;
}
}
return new int[]{res1,res2};
}
}