1.考察对于 异或知识点 的掌握
相同为0,不同为1
可以理解为:无进位相加
满足交换律和结合律:a^b = b^a,a^b^c = a^(b^c)
n^0 = n, n^n = 0
交换两个数的值
a = a^b
b = a^b
a = a^b
*a和b在内存中不能是一块位置,如果是一块位置,会把这块内存clear为0
2.在一个int类型数组中,只有一种数出现了奇数次,其他所有数都出现了偶数次
怎么找到出现了奇数次的值
int data = 0;
for(i=0;i<n;i++)
{
data ^= a[i];
}
3.继续扩展:在一个int类型数组中,只有两种数出现了奇数次,其他所有数都出现了偶数次,怎么找到出现了奇数次的两个值
int data= 0;
for(i=0;i<n;i++)
{
data ^= a[i];
}
r_one = data & (~data+1) //提取一个不为0的数最右侧的1
int temp = 0;
for(i=0;i<n;i++)
{
if(a[i] & r_one)
{
temp ^= a[i]
}
}
temp' = data ^ temp;
解析:
data 就是两个出现奇数次的值的异或
可以确定data 必不为0,因为如果data=0,那表示这两个数相等,和题意不符
所以data必定有个bit=1,然后找最右边bit位=1的bit
然后把所有这个bit位=1的数做异或
最后就能得到其中一个数