算法通关村——位运算白银挑战

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)

你可能感兴趣的:(算法,python,数据结构)