简单来说,相同的数异或运算结果为0,不相同的数异或运算结果为1,这里的运算,指的是二进制位的运算。
在解决实际问题时,需要抓住关键的几个特点。
阅读了这篇帖子:C语言异或操作详解(小小异或,大大作用~),把几点总结写在本文。
规律一:任何数和0的异或结果是该数本身,任何数和自己本身的异或结果为0
规律二:异或运算符合交换率和结合率
这里也总结下我认为的该帖中的例题的以及常见例题关键解题思路:
1.相同的数异或结果为0,而0与任意数异或结果为该任意数,因此异或运算可以很方便的在数组中找到指定的一个数
2.针对例题2,当需要找出数组中的两个仅出现一次的数时,可以先对数组所有数异或运算,得出这两个数的异或结果;找到任意一个这个异或结果的二进制位中结果为1(即两个数在这一位的值一个是0,一个是1)的位(方法是:两个数的异或结果x & 负两个数的异或结果-x,即x & -x);然后把原来的数组中,这个对应位二进制结果为0和结果为1的数分成两个新数组,这两个新数组中,均包含着若干出现次数2次的数以及其中一个仅出现一次的数;由规律一,这两个新数组的所有数分别异或,就可以分别得到一个仅出现一次的数。
异或运算另一个性质:
若x异或y=a,则x异或a=y
这里贴上一个leetcode题及题解:
421. 数组中两个数的最大异或值
https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/description/
https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/solutions/2652101/wei-yun-suan-zhao-chu-shu-zu-zhong-liang-tiza/