C++ 位操作与异或

C++ 位操作与异或,c++,algorithm,xor,bitmask,C++,Algorithm,Xor,Bitmask,我有一个关于算法中位操作的问题 给定一个整数数组,数组中的每个元素出现三次,只有一个元素只出现一次。找到只出现一次的元素 例如: Input : [1, 2, 4, 3, 3, 2, 2, 3, 1, 1] Output : 4 我遇到了使用XOR的解决方案,但我无法理解它。以下是解决方案: int singleNumber(vector<int> A) { int first = 0; int second = 0; for(auto n:A){

我有一个关于算法中位操作的问题

给定一个整数数组,数组中的每个元素出现三次,只有一个元素只出现一次。找到只出现一次的元素

例如:

Input : [1, 2, 4, 3, 3, 2, 2, 3, 1, 1]  
Output : 4
我遇到了使用XOR的解决方案,但我无法理解它。以下是解决方案:

int singleNumber(vector<int> A) {
    int first = 0;
    int second = 0;
    for(auto n:A){
        first = (first ^ n) & ~second;
        second = (second ^ n) & ~first;
    }
    return first;
}
[已编辑]


我已经包括了cout这段代码的作用是并行计算每个位的出现次数,mod 3

第一位的第n位和第二位的第n位共同构成这个计数器

看看当我把第一和第二部分写在一起,然后从新的数字中加入一部分时会发生什么。以下是所有的可能性:

             secondfirst    00  01  10    00  01  10
                 new bit     0   0   0     1   1   1
first=first^new &~second     0   1   0     1   0   0
+ sec=sec^new & ~first      00  01  10    01  10  00

如您所见,当新数字中的对应位为0时,这两位保持不变。但是,当新位为1时,它们会经历一个循环,每3步返回00。如果1的数量是3n+1,那么在执行过程中的哪一点您感到困惑?展示你打印的痕迹,或者你做过的桌面检查;解释你被困的地方。@Prune嗨,我已经编辑了我的问题,现在请回答。我将等待我请求的跟踪和解释。@Prune我没有被困在执行中。我只想解释一下,为什么这段代码有效?那么,我该如何回答解释部分呢?看看循环中的所有值,以及每个操作的结果。向我们解释一下你没有遵循顺序的地方。也许通过一点代数推导出第一和第二的新值作为n的函数。通过8行真值表查看每个输入组合的结果。
1 0
3 0
7 0
4 3
4 0
6 0
4 2
5 0
4 1
4 0
             secondfirst    00  01  10    00  01  10
                 new bit     0   0   0     1   1   1
first=first^new &~second     0   1   0     1   0   0
+ sec=sec^new & ~first      00  01  10    01  10  00