/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 */

#include <stdlib.h>
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int* FindNumsAppearOnce(int* nums, int numsLen, int* returnSize ) {
    // write code here
    if(numsLen == 0) {
        *returnSize = 0;
        return NULL;
    }
    int res = 0;
    // 求ans[0]^ans[1];
    for(int i = 0; i < numsLen; i++) {
        res ^= nums[i];
    }
    printf("res is %d\n", res);
    // 找到res中从后往前第一个出现1的位置
    int m = 1;
    while((res&m) == 0) {
        m <<= 1;
    }
    printf("m is %d\n", m);
    int* ans = (int*)calloc(0, sizeof(int) * 2);
    for(int i = 0; i < numsLen; i++) {
        if((nums[i]&m) == 0) {
            ans[0] ^= nums[i];
        }
    }
    printf("ans[0] is %d\n", ans[0]);
    ans[1] = res ^ ans[0];
    if(ans[0] > ans[1]) swap(&ans[0], &ans[1]);
    *returnSize = 2;
    return ans;
}