📜  Python |计算范围内的未设置位

📅  最后修改于: 2021-04-24 19:28:47             🧑  作者: Mango

给定一个非负数n和两个值l和r。问题在于以n的二进制表示形式对范围在l到r之间的未设置位数进行计数,即,对从最右边的第l位到最右边的r位的未设置位进行计数。

例子:

Input : n = 42, l = 2, r = 5
Output : 2
(42)10 = (101010)2
There are '2' unset bits in the range 2 to 5.

Input : n = 80, l = 1, r = 4
Output : 4

我们已有解决此问题的解决方案,请参阅计数范围链接中的未设置位。我们可以在Python快速解决此问题。办法很简单,

  1. 使用bin(num)函数将十进制转换为二进制。
  2. 现在删除输出二进制字符串的前两个字符,因为默认情况下bin函数将’0b’作为前缀附加在输出字符串。
  3. 对从索引(l-1)开始到索引r的字符串切片并将其反转,然后计算介于两者之间的未设置位。
# Function to count unset bits in a range
  
def unsetBits(n,l,r):
  
    # convert n into it's binary
    binary = bin(n)
  
    # remove first two characters
    binary = binary[2:]
  
    # reverse string
    binary = binary[-1::-1]
  
    # count all unset bit '0' starting from index l-1
    # to r, where r is exclusive
    print (len([binary[i] for i in range(l-1,r) if binary[i]=='0']))
  
# Driver program
if __name__ == "__main__":
    n=42
    l=2
    r=5
    unsetBits(n,l,r)

输出:

2