加速运算神器,位运算
首先我们需要熟悉python的位运算符:
a = 0011 1100
b = 0000 1101
位运算常用的运算符包括&(按位与), | (按位或),~(按位非),^(按位异或),<< (有符号左移位) ,>>(有符号右移位)。
0.位运算的基本功能
x^1s = ~x
实现数的位级反转。1s
表示一串1- 利用
x^x = 0
可以实现除重。保留唯一一个不重复的数字。 - 利用
x&mask
可以实现掩码,只保留想要的位置的数字。利用x|mask
可以实现置位。 n&(-n)
可以实现得到n的最低一位1。其中-n
的二进制是n的反码+1。0的反码是0000
- 移位运算包括算数和无符号,
>>
是算数,会补充相应的符号位。>>>
只补0 x&1
可以用来判断奇偶。- 使用
x&(x-1)
可以删除最低位的一个1
下面简单的记录一些运用位运算的例子:
1. 判断奇数偶数 (与 &)
def isodd(x):
return True id (x&1) else False
2. 寻找数组中独一无二的数字 (异或 ^)
def unique(nums):
# nums: List
ans = 0
for i in nums:
ans ^= i
return ans
3. 正反颠倒二进制位(leetcode190 )
def reverseBits(n):
res = 0
count = 32
while count>0:
res <<= 1
res += n&1
count -= 1
n >>= 1
return int(bin(res), 2)
4. 汉明距离
注意python的
bin()
函数返回的是字符串。如,bin(4)
返回的是"0b100"
class Solution(object):
def hammingDistance(self, x, y):
"""
:type x: int
:type y: int
:rtype: int
"""
return bin(x ^ y).count('1')
5. 交换两个内容(异或)
a = a ^ b
b = a ^ b
a = a ^ b