异或运算符∧, 相同为0,不同为1
性质:
①0∧N=N, N∧N=0
②满足交换律,结合律
即a∧b=b∧a,(a∧b)∧c=a∧(b∧c)
③同一批数做异或运算,运算结果与运算顺序无关
异或运算可理解为无进位加法,例如10110∧00111=10001
应用:
一、异或运算实现两个数交换:
a=a∧b;
b=a∧b;
a=a∧b;
解释:刚开始时a=甲,b=乙;
第一行运行后:a=甲∧乙,b=乙;
第二行运行后:a=甲∧乙,b=甲∧(乙∧乙)=甲∧0=甲;
第三行运行后:a=甲∧乙∧甲=(甲∧甲)∧乙=0∧乙=乙
实现交换。但需注意:只能对两个不同的数使用
二、题目:①在一整型数组中,只有一个数出现了奇数次,其余数均出现偶数次,找出出现了奇数次的数;②已知两组数出现了奇数次,其他所有数都出现了偶数次找到这两种数。
解:①定义一个变量eor=0,依次将eor与数组中每个数做异或运算,最终结果即为要找的出现奇数次的数(出现偶数次的数之间异或都等于0,而出现奇数次的会留下一个,任何数与0异或都等于本身,因此剩下出现奇数次的数)
②假设要找的两个出现奇数次的数为a,b。采用相同的思路,让变量eor=0与数组中所有数依次做异或运算,得到的结果eor=a^b,并且知道eor=a^b≠0,所以eor某一位上必定为1,即a与b在这一位上不同。那么,我们假设eor为1的这一位为第x位(x是已知的),再定义变量eor'=0,并将其与数组中所有第x位不是1的数,最终eor'得到a或b。最后eor^eor'得到另一个数。
代码第24行解释:
假设eor=100010,取反~eor=011101,再+1得011110,eor&(~eor+1)=000010即得到eor中最右侧的1