异或的特点
浅层特点
异或操作无非就是相同取1,相反取0,具体来说,就是比较连个整数的二进制表示形式,按位比较,对应位相同则取0,对应位相反则取1。上述就是比较浅显的认识。
深层特点
在刚开始学习C语言时,大概都会碰到交换两个数这个算法。其中一种解法就是用异或,代码如下。
int main()
{
int x = 10;
int y = 20;
x = x^y;
y = x^y;
x = x^y;
return 0;
}
代个数更容易理解,比如x=1,y=2,x^y=3,此时3与2异或得到1,3再与1异或就得到2。
那么,由此是不是可以推断出,当3个数参与异或,其中有2个数相同,结果就是那个不同的数。紧接上面的例子,1与2异或,接着再和2异或,结果就是1(不同的数)。将这个结论推广到n个数,即n个数参与异或运算,只要有成对的数字出现,那么异或的结果就不会出现这个数。
leetcode算法题举例
消失的数字
面试题 17.04. 消失的数字
思路1:利用异或。先将0~n异或,然后在和缺少一个数的数组异或。这样出现两次的数字异或之后就会“消失”,剩下的就是缺少的那个数。
int missingNumber(int* nums, int numsSize){
int i=0,t=0;
for(i=