C++使用异或找出数组中奇数次出现的数据
一、问题描述
现有一个数组,数组中的数成对出现,其中有两个数,奇数次出现。现编写程序,使用异或的方法找出数组中这两个数。
#include <iostream>
#include <vector>
int main() {
std::vector<int> arry = { 1,2,3,1 };
int err = 0;
//第一步找出两个数异或后的值
for (auto it : arry) {
err = err^ it;
}
//因为异或是不同为1,所以找到最右边的1,即这个位两个数中一个为0,一个为1,
//取err的反码,然后加1,找到最右边的为1的值
int rightOne = err & (~err + 1); //结果格式为000010这种格式,用这种格式继续后面的操作
//第二步,通过上面的1,为差别,找到相与为0的数找到两个中的一个。
int onlyOne = 0;
for (auto it : arry) {
if((it & rightOne) == 0)
onlyOne = onlyOne ^ it;
}
std::cout << "第一个数是 " << onlyOne << std::endl;
std::cout << "第二个数是" << (onlyOne ^ err) << std::endl;
int a = 10;
int b = 3;
int c = a ^ b; //a与b,进去c
int d = a ^ c; //a与c,从c里面出来。
std::cout << "b是" << d << std::endl;
return 0;
}