位运算
代码中不留下一些位运算,离职的时候就装逼不起来,一来确实高效,二来确实也很骚气,下面几个是我觉得常用的例子
交换两个数(异或)
这玩意儿很常见,代码中偶尔都会用到
两个相同的数异或之后为 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. 只出现一次的数字
class Solution:
def singleNumber(self, nums: List[int]) -> int:
res = 0
for i in nums:
res = res ^ i
return res