主要考察异或运算,适用于分配率和结合率。
在本题中,主要是考察将得到的eor=a^b进行拆分,因为eor!=0;所以二进制数位中必定有一位是1 ,所以可以将数组分为此二进制位是1和不是1的两种情况,而且也可以保证除了a和b,数组中分成两种情况的其他的数都是偶数。(注:偶数个的数异或后=0)(c^c^c=c ; c^c^c^c=0)
#include <iostream>
using namespace std;
int main()
{
const int length = 6;
int arr[length] = { 2,1,3,1,1,2 };//'2','3','2','1','1','1'
int eor = 0; int eor1 = 0;
for (int i = 0; i < length; i++)
{
eor = eor ^ arr[i];//得到a^b
}
int onlyone = eor & (~eor + 1);//得到二进制数位中最右侧为1的数位
for (int i = 0; i < length; i++)
{
if ((arr[i] & onlyone) == 0)//得到数组中与最右侧数位1相同的数
{
eor1 = eor1 ^ arr[i];//找到a或者是b
}
}
eor = eor1 ^ eor;
cout << eor1 << " " << eor << endl;
return 0;
}
尾注
留下笔记,只为方便回忆,如有侵权,还请联系,如有错误,恳请纠正。