给定一个非负数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快速解决此问题。办法很简单,
- 使用bin(num)函数将十进制转换为二进制。
- 现在删除输出二进制字符串的前两个字符,因为默认情况下bin函数将’0b’作为前缀附加在输出字符串。
- 对从索引(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