2.白银挑战——位运算的高频算法题
1 位移的妙用
1.1 位1的个数
LeetCode191:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数位1的个数
class HammingWeight:
def hammingWeight(self, n):
count = 0
while n != 0:
n = n & (n - 1)
count += 1
return count
if __name__ == "__main__":
hammingWeight = HammingWeight()
print(hammingWeight.hammingWeight(7))
print(hammingWeight.hammingWeight(15))
1.2 比特位计数
LeetCode338:给你一个整数n,对于0<=i<=n中的每个i,计算其二进制表示中1的个数,返回一个长度为n+1的数组ans作为答案
class HammingWeights:
def countOnes(self, x):
count = 0
while x != 0:
x = x & (x - 1)
count += 1
return count
def countBits(self, num):
bits = []
for i in range(num + 1):
bits.append(self.countOnes(i))
return bits
if __name__ == "__main__":
hammingWeights = HammingWeights()
print(hammingWeights.countBits(5))
1.3颠倒无符号整数
LeetCode190:颠倒给定的32位无符号整数的二进制位。提示:输入是一个长度为32的二进制字符串
n的二进制表示的从低到高第i位,在颠倒之后变成第31-i位(0<=i<32),所以可以从低到高遍历n的二进制表示的每一位,将其放到其在颠倒之后的位置,最后相加即可。
class ReverseBits:
def reverseBits(self, n):
reversed = 0
power = 31
while n != 0:
reversed += (n & 1) << power
n >>= 1
power -= 1
return reversed
if __name__ == "__main__":
reverseBits = ReverseBits()
print(reverseBits.reverseBits(43261596))
2.位实现加减乘除专题
计算机中,位运算的效率比加减乘除效率更高
2.1位运算实现加法
LeetCode371:给你两个整数a和b,不适用运算符+和-,计算并返回两整数之和。
不进位部分:用a⊕b计算就可以了
是否进位,以及进位值使用(a & b)<<1计算就可以了。
class GetSum:
def getSum(self, a, b):
while b != 0:
sign = (a & b) >> 1
a = a ^ b
b = sign
return a
if __name__ == "__main__":
getSum = GetSum()
res = getSum.getSum(1, 2)
print(res)