浅谈627. Swap Salary(交换工资)的题解区中的 位运算之 “异或运算”(一)

之前解析完Leetcode最后一道非VIP的SQL题 👉交换工资。其中最有意思的是有个解法使用了 “异或运算”,于是今天打算浅谈一下这个高效的方法。

  • 首先,什么是位运算的“异或运算”?
    其实这个运算全称是 “按位异或(英文叫eXclusive OR,简称 XOR)”,看过掌柜之前这篇博客的朋友应该都知道之前掌柜谈了位运算的按位与(&)运算。
    其实它还有另外几种(按位或(|)、按位取反(~)、左移运算 (<<)以及右移运算(>>)),还没遇到类似案例就暂不提,今天主要解决👉异或运算。
    简单来说,异或运算就是对两个输入位进行比较,如果这两位是相同的,就输出0;否则输出1。 这里常用 ^来表示两个输入位在进行异或运算。比如👇下面这几种:
    a ^ a = 0 (同为a, 所以输出0;下面同理)
    a ^ b = 1
    1 ^ 7 = 1
    9 ^ 9 = 0

  • 其次,异或运算的一些常见用法有哪些呢? / 用异或运算可解决哪些问题?

    • 第一种,就是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)。
此题就很好的体现了异或运算的优点!而且运行起来还省内存。
(未完待续…)

参考资料:
数学专栏课外加餐(二) | 位操作的三个应用实例

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值