给定一个非负数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
方法:以下是步骤:
- 计算num =(((1 << r)– 1)^((1 <<(l-1))– 1)。这将产生一个具有r个位数的数字num ,并且范围l到r的位是唯一的设置位。
- 计数设置位数(n和num)中的位数。请参阅这篇文章。算吧。
- 计算ans =(r – l + 1)–计数。
- 返回ans 。
C++
// C++ implementation to count unset bits in the
// given range
#include
using namespace std;
// Function to get no of set bits in the
// binary representation of 'n'
unsigned int countSetBits(int n)
{
unsigned int count = 0;
while (n) {
n &= (n - 1);
count++;
}
return count;
}
// function to count unset bits
// in the given range
unsigned int countUnsetBitsInGivenRange(unsigned int n,
unsigned int l, unsigned int r)
{
// calculating a number 'num' having 'r' number
// of bits and bits in the range l to r are the
// only set bits
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
// returns number of unset bits in the range
// 'l' to 'r' in 'n'
return (r - l + 1) - countSetBits(n & num);
}
// Driver program to test above
int main()
{
unsigned int n = 80;
unsigned int l = 1, r = 4;
cout << countUnsetBitsInGivenRange(n, l, r);
return 0;
}
Java
// Java implementation to count unset bits in the
// given range
class GFG {
// Function to get no of set bits in the
// binary representation of 'n'
static int countSetBits(int n)
{
int count = 0;
while (n > 0) {
n &= (n - 1);
count++;
}
return count;
}
// function to count unset bits
// in the given range
static int countUnsetBitsInGivenRange(int n,
int l, int r)
{
// calculating a number 'num' having 'r'
// number of bits and bits in the range
// l to r are the only set bits
int num = ((1 << r) - 1) ^ ((1 <<
(l - 1)) - 1);
// returns number of unset bits in the range
// 'l' to 'r' in 'n'
return (r - l + 1) - countSetBits(n & num);
}
// Driver code
public static void main(String[] args)
{
int n = 80;
int l = 1, r = 4;
System.out.print(
countUnsetBitsInGivenRange(n, l, r));
}
}
// This code is contributed by Anant Agarwal.
Python3
# Python3 implementation to count
# unset bits in the given range
# Function to get no of set bits in
# the binary representation of 'n'
def countSetBits (n):
count = 0
while n:
n &= (n - 1)
count += 1
return count
# function to count unset bits
# in the given range
def countUnsetBitsInGivenRange (n, l, r):
# calculating a number 'num' having
# 'r' number of bits and bits in the
# range l to r are the only set bits
num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1)
# returns number of unset bits
# in the range 'l' to 'r' in 'n'
return (r - l + 1) - countSetBits(n & num)
# Driver code to test above
n = 80
l = 1
r = 4
print(countUnsetBitsInGivenRange(n, l, r))
# This code is contributed by "Sharad_Bhardwaj"
C#
// C# implementation to count unset bits in the
// given range
using System;
class GFG {
// Function to get no of set bits in the
// binary representation of 'n'
static int countSetBits(int n)
{
int count = 0;
while (n > 0) {
n &= (n - 1);
count++;
}
return count;
}
// function to count unset bits
// in the given range
static int countUnsetBitsInGivenRange(int n,
int l,int r)
{
// calculating a number 'num' having 'r'
// number of bits and bits in the range l
// to r are the only set bits
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
// returns number of unset bits in the range
// 'l' to 'r' in 'n'
return (r - l + 1) - countSetBits(n & num);
}
//Driver code
public static void Main()
{
int n = 80;
int l = 1, r = 4;
Console.Write(countUnsetBitsInGivenRange(n, l, r));
}
}
//This code is contributed by Anant Agarwal.
PHP
Javascript
输出:
4