Given a non-negative number n and two values l and r. The problem is to count the number of unset bits in the range l to r in the binary representation of n, i.e, to count unset bits from the rightmost lth bit to the rightmost rth bit.
Examples:
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
Approach: Following are the steps:
- Calculate num = ((1 << r) – 1) ^ ((1 << (l-1)) – 1). This will produce a number num having r number of bits and bits in the range l to r are the only set bits.
- Count number of set bits in the number (n & num). Refer this post. Let it be count.
- Calculate ans = (r – l + 1) – count.
- Return ans.
C++
#include <bits/stdc++.h>
using namespace std;
unsigned int countSetBits( int n)
{
unsigned int count = 0;
while (n) {
n &= (n - 1);
count++;
}
return count;
}
unsigned int countUnsetBitsInGivenRange(unsigned int n,
unsigned int l, unsigned int r)
{
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
return (r - l + 1) - countSetBits(n & num);
}
int main()
{
unsigned int n = 80;
unsigned int l = 1, r = 4;
cout << countUnsetBitsInGivenRange(n, l, r);
return 0;
}
|
Java
class GFG {
static int countSetBits( int n)
{
int count = 0 ;
while (n > 0 ) {
n &= (n - 1 );
count++;
}
return count;
}
static int countUnsetBitsInGivenRange( int n,
int l, int r)
{
int num = (( 1 << r) - 1 ) ^ (( 1 <<
(l - 1 )) - 1 );
return (r - l + 1 ) - countSetBits(n & num);
}
public static void main(String[] args)
{
int n = 80 ;
int l = 1 , r = 4 ;
System.out.print(
countUnsetBitsInGivenRange(n, l, r));
}
}
|
Python3
def countSetBits (n):
count = 0
while n:
n & = (n - 1 )
count + = 1
return count
def countUnsetBitsInGivenRange (n, l, r):
num = (( 1 << r) - 1 ) ^ (( 1 << (l - 1 )) - 1 )
return (r - l + 1 ) - countSetBits(n & num)
n = 80
l = 1
r = 4
print (countUnsetBitsInGivenRange(n, l, r))
|
C#
using System;
class GFG {
static int countSetBits( int n)
{
int count = 0;
while (n > 0) {
n &= (n - 1);
count++;
}
return count;
}
static int countUnsetBitsInGivenRange( int n,
int l, int r)
{
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
return (r - l + 1) - countSetBits(n & num);
}
public static void Main()
{
int n = 80;
int l = 1, r = 4;
Console.Write(countUnsetBitsInGivenRange(n, l, r));
}
}
|
PHP
<?php
function countSetBits( $n )
{
$count = 0;
while ( $n )
{
$n &= ( $n - 1);
$count ++;
}
return $count ;
}
function countUnsetBitsInGivenRange( $n , $l , $r )
{
$num = ((1 << $r ) - 1) ^
((1 << ( $l - 1)) - 1);
return ( $r - $l + 1) -
countSetBits( $n & $num );
}
$n = 80;
$l = 1;
$r = 4;
echo countUnsetBitsInGivenRange( $n , $l , $r );
?>
|
Javascript
<script>
function countSetBits(n)
{
var count = 0;
while (n) {
n &= (n - 1);
count++;
}
return count;
}
function countUnsetBitsInGivenRange(n, l, r)
{
var num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
return (r - l + 1) - countSetBits(n & num);
}
var n = 80;
var l = 1, r = 4;
document.write( countUnsetBitsInGivenRange(n, l, r));
</script>
|
Output:
4
Time Complexity: O(log n)
Space Complexity: O(1)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!