背景知识:
异或运算:相同为0,不同为1 记:无进位相加。
同或运算:相同为1,不同为0
一、异或运算
1.1什么是异或运算
异或运算:相同为0,不同为1 无进位相加
13——>01101
7——>00111
13^7=?(异或运算)
1.2异或运算的特点
满足交换律结合律(一批数进行异或运算,不管顺序怎么变,结果都一样)
1.3异或运算常见算法题
1、如何不用额外变量交换两个数
题目:a=17 b=13如何不用额外变量交换两个数?
实现:a=a^b;
b=a^b;
a=a^b;
总结:用这三行代码可以换交换两个数
注意:只有两个数的内存位置不同,才能这样写(值可以一样,内存地址不同才行)
所以数组中i和j位置的数交换,i和j不能相等。
所以上游调用的时候要保证,i!=j
2、一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数?
int eor=0; eor^a^b^a^c^b...... 异或了奇数次的数
3、怎么把一个int类型的数,提取出最右侧的1?
a取反+1=-a
4、一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数?
5、一个数组中有一种数出现了K次,其他数都出现了M次,M一定是>1,K<M,找到出现了K次的数?