之前解析完Leetcode最后一道非VIP的SQL题 👉交换工资。其中最有意思的是有个解法使用了 “异或运算”,于是今天打算浅谈一下这个高效的方法。
-
首先,什么是位运算的“异或运算”?
其实这个运算全称是 “按位异或(英文叫eXclusive OR,简称 XOR)”,看过掌柜之前这篇博客的朋友应该都知道之前掌柜谈了位运算的按位与(&)运算。
其实它还有另外几种(按位或(|)、按位取反(~)、左移运算 (<<)以及右移运算(>>)),还没遇到类似案例就暂不提,今天主要解决👉异或运算。
简单来说,异或运算就是对两个输入位进行比较,如果这两位是相同的,就输出0;否则输出1。 这里常用^
来表示两个输入位在进行异或运算。比如👇下面这几种:
a ^ a = 0 (同为a, 所以输出0;下面同理)
a ^ b = 1
1 ^ 7 = 1
9 ^ 9 = 0 -
其次,异或运算的一些常见用法有哪些呢? / 用异或运算可解决哪些问题?
- 第一种,就是627题里面的:交换两数。
这里就拿627题的解法作示例:
- 第一种,就是627题里面的:交换两数。
UPDATE salary SET sex = CHAR(ASCII(sex) ^ ASCII("m") ^ ASCII("f"));
可以看到该解法:先拿sex同m进行交换比较,如果sex=‘m’,就输出0;然后就是0继续异或ASCII(“f”) 。
这里要提一个知识点👉:任意数和0进行异或的时候都等于它本身!
肯定就要朋友要问了,那么如果sex!=m呢?
别慌😁掌柜马上给出它的思路。当sex!=m的时候,刚刚不是说异或运算可以交换两数吗?此时根据交换法则:
ASCII(sex)^ASCII("m")^ASCII("f") = ASCII(sex)^ASCII("f")^ASCII("m")
交换位置后,sex=f,所以同样后面也是 0异或m的运算,所以还是等于它本身(m)。
此题就很好的体现了异或运算的优点!而且运行起来还省内存。
(未完待续…)
参考资料:
数学专栏课外加餐(二) | 位操作的三个应用实例