异或
- 运算:a=100 (4) b=001(1) 则a^b=101(7)
- 应用: (1)两个数交换而不用中间变量。
代码:
#include<iostream>
using namespace std;
int main(){
int a=4,b=3;//a=100 b=011
a=a^b;//a=100^011=111
b=a^b;//b=111^011=100
a=a^b;//a=111^100=011
cout<<a<<" "<<b<<endl;
}
运行结果:
(2)利用异或求一个数的奇偶性。先把一个数由十进制转换为二进制,再与0进行异或运算。如果结果为true,则此数为奇数。
代码:
#include<iostream>
using namespace std;
int a[10],n=5,j,ans;
int main(){
while(n){a[j++]=n%2;n/=2;}
for(int i=0;i<j;i++)ans^=a[i];
if(ans)puts("n为偶数!");//异或结果为true则n为偶数,反之,反之。
else puts("n为奇数!");
}
(3)找出一堆数中的不同的异或运算的应用:
题目一:
有2n+1个数,只有一个单着,别的都是成对的,找出这个单着的数。比如:2 1 3 2 1。
#include<iostream>
using namespace std;
int main(){
//用异或,因为每个数异或自己本身都是0,而0与任何数异或都是数本身。
int n,a[100];
cin>>n>>a[1];
for(int i=2;i<=n;i++)cin>>a[i],a[i]^=a[i-1];
cout<<a[n]<<endl;
}
题目二:
1-n放在含有n+1个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。用异或求出重复值。