求大佬帮我看一下这段代码
题目:错误的集合
集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。
给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入: nums = [1,2,2,4]
输出: [2,3]
注意:
给定数组的长度范围是 [2, 10000]。
给定的数组是无序的。
代码如下:
int* findErrorNums(int* nums, int numsSize, int* returnSize){
int resLianxu = 0;
for(int i = 1; i < numsSize + 1; i++)
{
resLianxu ^= i; //从这里看出来我知道这题是用异或运算解的
}
int resUnLianxu = 0;
for(int j = 0; j < numsSize; j++)
{
resUnLianxu ^= nums[j];
}
int resOr = resUnLianxu ^ resLianxu;
int lastbit = resOr & (-resOr); //从这一步开始我就看不懂了,这里为什么要用到按位与运算?为什么要用相反数?请大佬从这里开始往下解释
int res1 = 0;
int res2 = 0;
for (int m = 0; m < numsSize; m++)
{
if((nums[m] & lastbit) == 0) res1 ^=nums[m];
else res2 ^=nums[m];
}
for (int n = 1; n < numsSize+1; n++)
{
if((n & lastbit) == 0) res1 ^=n;
else res2 ^=n;
}
int *res = (int*)malloc(2 * sizeof(int));
res[0] = res1;
res[1] = res2;
for (int z = 0; z < numsSize; z++)
{
if(res2 == nums[z])
{
res[1] = res1;
res[0] = res2;
}
}
*returnSize = 2;
return res;
}