异或
0和0异或产生0,0和1; 1和0异或得到1;1和1异或得到0。
简单总结:不同的产生1;否则0。代表的是差别。 补充AND,OR。
AND
0&0=0
1&1=1
0&1=0
只有两个同时满足才能满足。
OR
0|0=0
1|1=1
0|1=1
只要有一个满足就满足。
再理解:异或的操作,如同生孩子,只有男女之间才能满足结果;其他的无法满足。
汇总
& - bitwise and
| - bitwise or
^ - bitwise xor
~ - bitwise not
<< - bitwise shift left
>> - bitwise shift right
性质
异或运算的简单性质:
1. a ⊕ a = 0
2. a ⊕ b = b ⊕ a 交换律
3. a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c; 结合律
4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
5. a ⊕ b ⊕ a = b.
6. a ⊕ 0 = a
应用
找出两个数有差异的位
a⊕b得到的结果中,1表示在该位两数存在差别,0表示无差别,这个很好理解。
再来看a^b^a=b,a^b得到a和b有差别的位,在用这个结果异或a,相当于将a中把有差别的位都改变取值,改了自然就没有差别了,就成了b。所以两数交换的解释应该可以同理。
例子:
https://leetcode.com/problems/hamming-distance/description/
The Hamming distance between two integers is the number of positions at which the corresponding bits are different. Given two integers x and y, calculate the Hamming distance.
求解方法就可以用异或解决。 异或之后,数字里有多少个bit=1则就是海明距离。
求解方法放到了github上.
找出现一次的数
https://leetcode.com/problems/single-number/description/
所有的数字中,只有一个数字出现了一次,其他的都出现了两次,找到这个数字。
利用性质5即可。
交换两个整数的值而不必用第三个参数
利用性质5; a^(a^b) = b 进行交换;
算法:
a = a^b; //a is xor, as diff
b = a^b; //b 减掉了ab之间的差异,那就变成a的值;交换成功
a = a^b; //b也就是原来a的值,减掉了ab的差异,那就变成了b;交换成功。
如果用中间变量可能更好理解这个概念:
diff = a^b
new_b = a^diff;
new_a = b^diff;
格雷码(Gray code)
格雷码是一个数列集合,相邻两数间只有一个位元改变,为无权数码,且格雷码的顺序不是唯一的。特点就是任意一个数字的二进制,和下一个数的二进制只有一个bit的差异。 具有变换的稳定性,具有循环属性。
leetcode上面的描述也非常清晰,我们引用一下
The gray code is a binary numeral system where two successive values differ in only one bit.
Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:
00 - 0
01 - 1
11 - 3
10 - 2
求解方法:
第一种
第二种
公式
自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。
公式为:
next_gray = gray ^ ( gray >>1)
总结
- 异或代表的是两个变量之间的求差异的过程。
- 异或的性质用的最多的还是异或自己得到0, 0异或自己还是自己,这个性质。
- 格雷码是异或的一种应用,满足了数序列的变换稳定性。
参考文献
https://en.wikipedia.org/wiki/Gray_code
https://blog.csdn.net/u013686654/article/details/76375369
https://www.cnblogs.com/danh/archive/2010/12/24/1915810.html
http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know/