异或XOR的再理解以及在leetcode上的应用

23 篇文章 0 订阅
6 篇文章 0 订阅

异或

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)

总结

  1. 异或代表的是两个变量之间的求差异的过程。
  2. 异或的性质用的最多的还是异或自己得到0, 0异或自己还是自己,这个性质。
  3. 格雷码是异或的一种应用,满足了数序列的变换稳定性。

参考文献

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/

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值