异或
作者:互联网
异或运算满足交换率、结合律。
性质:
- a^0 = a
- a^a = 0
应用:
-
不需额外变量交换两个数的值(前提是a和b不能在同一个内存单元中)
a = a^b
b = a^b
a = a^b -
提取出int类型最右边的1
a & (~a + 1) -
一个数组中有两个数出现了奇数次,其他数都出现了偶数次,求出现奇数次的这两个数?
用一个变量eor将数组中所有的数异或一遍,假设a,b出现了奇数次,且a不等于b,则eor= a^b ,且不为0,所以eor中必有一个位为1。因此可以将eor最右边为1的那一位是否为1可以将整个数组分为两类,一类是该位为1,另一类是该位为0,而a和b必属于两类。因此可以再用一个变量,将该位为1的数异或一遍,就的得到了一个数出现了奇数的数。
int a[6] = { 1,2,2,3,4,4 };//1和3出现了奇数次
int eor = 0;
int eor1 = 0;
int re1;
int re2;
for (int i = 0; i < 6; ++i) {
eor = eor ^ a[i];
}
int rightestOne = eor & (~eor + 1);
for (int i = 0; i < 6; ++i) {
if ((a[i] & rightestOne) == 0) {//该位为0的数
eor1 = eor1 ^ a[i];
}
}
re1 = eor1;
re2 = eor ^ re1;
cout << re1 << "," << re2 << endl;
标签:该位,eor1,int,re1,eor,异或 来源: https://www.cnblogs.com/dylan-blog/p/16478034.html