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

📅  最后修改于: 2021-05-07 10:19:55             🧑  作者: Mango

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

约束: 1 <= l <= r <= n的二进制表示形式的位数。

例子:

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

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

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

  1. 使用bin(num)函数将十进制转换为二进制。
  2. 现在删除输出二进制字符串的前两个字符,因为默认情况下bin函数将’0b’作为前缀附加在输出字符串。
  3. 对从索引(l-1)开始到索引r的字符串切片并将其反转,然后对介于两者之间的设置位进行计数。
# Function to count set bits in a range
   
def countSetBits(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 set bit '1' 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]=='1']))
   
# Driver program
if __name__ == "__main__":
    n=42
    l=2
    r=5
    countSetBits(n,l,r)

输出:

2