Count unset bits in a range
Last Updated :
15 Jun, 2022
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)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...