异或的使用:
- 概念:相同为0,不相同为1 (简单记忆:不进位相加即为异或)
比如说:
00011010
(异或)
10010100
= 10001110
- [danger]用法:a^0 = a a^a=0 a^a^a=a[/danger]
- 实例:
- 一、两个数互换 (a,b) 则可以这样操作:a = a ^ b , b = a^b (此时得到b等于a) , a = a ^ b(此时得到a等于b)
- 二、找到一个数组中唯一为奇次数的哪个数 [ 1,1,2] 此时唯一为奇次数的为
核心代码: int num = 0; 然后一直让其与数组的数异或即可 总的来看就是num = 0^1 ^ 1 ^2(偶次数的数将会抵消)
- 三、扩展:找到一个数组中的两个奇次数的数 [1,2,2,3] 此时的两个奇次数为1,3
我们需要一个额外的知识点:就是找到一个数的二进制数最后一个为1的位
比如 a = 0001 1100 找到红色的1 ,则可以 b = a & (~a + 1)
a=0001 1100 ~a = 1110 0011 ~a+1 = 1110 0100 会发现a与~a+1后会得到 c =0000 0100
那么我们得到 0000 0100有什么用呢?
首先我们使用 二 中的方法可以得到 num = a ^ b (a,b即为我们需要的两个数),num的二进制数中的最后一个为1的位肯定是因为a和b在这个位置上不一样。此时我们便可以把a和b分为两个阵营了(某位数为1的,和某位数为0的)
此时再次遍历数组,将某位数为1(怎么判断?Tmp ^c!=0 )的全部异或(那么我们便可以得到a或者b了),得到其中一个数后,另外一个数我们可以使用 num ^ 得到的数 即为另一个数