位运算

代码中不留下一些位运算,离职的时候就装逼不起来,一来确实高效,二来确实也很骚气,下面几个是我觉得常用的例子

交换两个数(异或)

这玩意儿很常见,代码中偶尔都会用到

两个相同的数异或之后为 0,任何数与 0 异或都是他本身

我们常用的交换是引入一个中间变量来交换

a = 10
b = 20
tmp = a
a = b
b = tmp
print(a, b)

异或的方式:b = a^b = (a^b)^b = a^(b^b) = a^0 = a,这样就把 a 的值赋给了 b

a = 10
b = 20
a = a ^ b
b = a ^ b
a = a ^ b
print(a, b)

找没有重复的数(异或)

arr = [2, 3, 1, 1, 2, 3, 5, 7, 7]

n = len(arr)
tmp = arr[0]
for i in range(1, n):
    tmp = tmp ^ arr[i]
print(tmp)

判断奇偶数(与运算)

我们常用的方式是用除 2 来判断

a = 10
a % 2

任何数以二进制来看的话,只需要判断最后一位是 0 还是 1 就好了,是 0 的话就是偶数,是 1 的话就是奇数

这个时候来个与运算,装逼一下

a = 10
a & 1

打印一个数的二进制(与运算)

def printx(num):
    for i in range(31, -1, -1):
        if num & (1<<i) == 0:
            print(0, end="")
        else:
            print(1, end="")
    print()

总结

  • & 与运算:两个都是 1,结果是 1,否则是 0
  • | 或运算:两个都是 0,结果是 0,否则是 1
  • ^ 异或运算:两个相同,结果是 0,否则是 1
  • ~ 取反运算

136. 只出现一次的数字open in new window

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        res = 0
        for i in nums:
            res = res ^ i
        return res
上次更新:
贡献者: kongzZ