杭电oj 2095 & 异或^符号在C/C++中的使用
异或^符号,在平时的学习时可能遇到的不多,不过有时使用得当可以发挥意想不到的结果。
值得注意的是,异或运算是建立在二进制基础上的,所有运算过程都是按位异或(即相同为0,不同为1,也称模二加),得到最终结果。
特点:任何数和0异或都等于它本身;两个相同的数异或后的结果是0;
举例如下:
int a = 4 =100(二进制)
int b = 3 =011(二进制)
int c = a^b = 111 = 7;
下面就^常用应用做个介绍:
1. 在一排数中找到独一无二的一个数
本例启发来自于杭电oj 2095,在一排数字中,如果某一个数字的出现次数是奇数,则可以唯一判断出来。(代码为oj2095 题解)
1 #include<stdio.h> 2 int main() 3 { 4 int T; 5 while(scanf("%d",&T)!=EOF && T) 6 { 7 int a,result=0; 8 while(T--) 9 { 10 scanf("%d",&a); 11 result = result^a; 12 } 13 printf("%d\n",result); 14 } 15 return 0; 16 }
2.实现两个数的交换
a=a^b;
b=a^b;//b=a^b^b=a^0=a;
a=a^b;//a=a^a^b=0^b=b;
1 #include<stdio.h> 2 int main() 3 { 4 int a=3; 5 int b=4; 6 a=a^b; 7 b=a^b; 8 a=a^b; 9 printf("a:%d b:%d",a,b); 10 return 0; 11 }
3.判断两个数是否相等
if(a^b==0)
printf("a=b");
else
printf("a!=b");