异或运算

异或运算的性质****
1、相异为1 == 无进位相加

00100111 ^
10101011
=10001100

2、满足交换律和结合律
(1) a ^ b = b ^ a
(2) a ^ b ^ c = a ^ (b ^ c)

3、根据无进位相加比较好理解 N ^ 0 = N N ^ N = 0

=======================================================================================

异或运算的应用
1、如何在吧定义额外空间变量的情况下交换两个变量a和b的值?
a = a ^ b; >>> a = a ^ b b = b
b = a ^ b; >>> a = a ^ b b = a ^ b ^ b = a ^ 0 = a
a = a ^ b; >>> a = a ^ b ^ a = b ^ 0 = b b = a

2、一个数组中有一个数出现了奇数次,其他数都出现了偶数次,求这个出现了奇数次的数?
将所有的数异或一遍,因为N ^ N = 0, 所以最后的结果就是出现了奇数次的数

3、一个数组中有2个数出现了奇数次,其他数出现了偶数次,求这两个数?
假设要求的数为N1和N2
首先将所有的数异或一遍,得到的结果为result = N1 ^ N2
取出result最右边的1, 说明N1与N2,在1所在的位置,一定是一个为1, 一个为0
根据该位置的1,将所有数分为两组,一组数该位置为1,另一组数该位置的0,故将N1和N2分到了两个组内,再根据2中的方法即可求出每组里面唯一出现了奇数次的数

4、取出最右侧的1的操作 : N & (~N + 1)

5、求数组的中点
(1)mid = (L + R) / 2 此方法可能存在 L + R 溢出,造成结果异常
推荐使用 mid = L + (R - L) / 2 = L + ((R - L) >> 1)
(注意使用的括号,因为左移右移的运算优先级比加减要低)

posted @ 2020-11-05 00:38  江湖法师  阅读(448)  评论(0)    收藏  举报