C 使用xor的数组中重复且缺失的数字

C 使用xor的数组中重复且缺失的数字,c,arrays,algorithm,data-structures,C,Arrays,Algorithm,Data Structures,如何使用xor查找重复数和缺失数? 例如:actual=[1,2,3]input\u received=[3,2,3]。这里缺少的数字是1,重复的数字是3。我在冲浪时发现了一个很有趣的解决方案 int missing_and_repeating(int a[], int n, int size){ int xor =0; int i; int x =0 , y =0; for(i=0; i<size; i++) xor = xor^a[i];

如何使用xor查找重复数和缺失数? 例如:
actual=[1,2,3]
input\u received=[3,2,3]
。这里缺少的数字是
1
,重复的数字是
3
。我在冲浪时发现了一个很有趣的解决方案

int missing_and_repeating(int a[], int n, int size){
    int xor =0;
    int i;
    int x =0 , y =0;
    for(i=0; i<size; i++)
        xor = xor^a[i];
    for(i=1; i<=n; i++)
        xor = xor^i;

    // Get the rightmost bit which is set
    int set_bit_no = xor & ~(xor -1);
    // XOR numbers in two buckets
    for(i=0; i<size; i++){
        if(a[i]& set_bit_no){
            x = x^a[i];
        }
        else
            y = y^ a[i];
    }
    for(i=1; i<=n; i++){
        if(i & set_bit_no)
            x = x^i;
        else
            y = y^i;
    }

    printf("\n %d %d ", x,y );
}
int缺失和重复(int a[],int n,int size){
int-xor=0;
int i;
int x=0,y=0;

对于(i=0;i我假设前提条件是恰好一个数组元素丢失,而被另一个元素的副本替换。因此,
actual={a1,a2,…,an}
input_received={a2,a2,…,an}
(我们总是可以重新排列元素,以便
a1
丢失并且
a2
重复)

因此,当对两个数组中的所有元素进行异或运算时,会得到
xored=a1^a2

现在我们必须分解这个数字才能知道
a1
a2
。你取一个非零位(不管是哪一个,最简单的方法是取最低有效位,就像在代码中一样,如果
a1!=a2
,你总是有一个)。此位仅在数字
a1
a2
中的一个中设置。因此,对所有具有此位的数字进行异或,它们将相互湮灭,只留下
a1
a2
,然后对所有其他数字进行异或,因此结果将分别是另一个数字-
a2
a1

需要注意的是,该算法不会告诉这些数字中哪些丢失了,哪些重复了。下面的代码说明了这一点:

int main() {
    int arr1[] = {1, 1};
    missing_and_repeating(arr1, 2, 2);
    int arr2[] = {2, 2};
    missing_and_repeating(arr2, 2, 2);
}
输出:

1 2
1 2

如何返回结果,一个集合或数组,包含一个数组的元素,结果应该是数组的元素。在这个例子中,结果应该是1,这不是C++,<代码> XOR >代码>是一个保留的令牌。我真的没有得到“设置位”这个词。请解释一下。请用一个例子解释一下,这个拆分是如何在设置位的帮助下发生的。@user2112700我可以,但是你自己做会更有用。