异或的使用
1. 异或交换两个数字的值
//异或 交换两元素的值
void swap(int &a,int &b){
a=a^b;
b=a^b;
a=a^b;
}
(性质:相同异或为0,0与任何数异或得任何数,异或满足交换律)
例如:上述代码解释如下
注意:在使用过程中,a与b不能使用一块空间,若是一块空间则自己与自己异或,则答案为0;则不能交换;
2. 数组中有一个为奇数次出现的数字,其余都是偶数次出现,求这个奇数次数出现的数值
利用异或时间复杂度为O(n)
int findOdd(int *arr){
int reor=0;
int len=sizeof(arr)/sizeof(arr[0]);//数组长度
for(int i=0;i<len;i++){
reor^=arr[i]; //相同数字为0;
}
return reor;
}
3. 数组中有两个为奇数次出现的数字,其余都是偶数次出现,求这两个奇数次数出现的数值
void findTwoOdd(int *arr,int len)
{
int reo=0;
for ( int i = 0; i < len; i++)
{
reo^=arr[i]; //异或 reo=a^b;两个奇数次的异或 reo!=0,ero必然有个位置为1
}
// cout<<reo<<endl;
int rightOne=reo & (~reo+1); //取反 reo1=~reo;提取最后一位二进制为1的数
int reo1=0;
for (int i = 0; i < len; i++)
{
if ((arr[i] & rightOne) == rightOne)
{
reo1^=arr[i];
}
}
cout << reo1<<" " << (reo^reo1)<<endl;
}