Count set bits in a range
Last Updated :
15 Jul, 2022
Given a non-negative number n and two values l and r. The problem is to count the number of set bits in the range l to r in the binary representation of n, i.e, to count set bits from the rightmost lth bit to the rightmost rth bit.
Constraint: 1 <= l <= r <= number of bits in the binary representation of n.
Examples:
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
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.
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 countSetBitsInGivenRange(unsigned int n,
unsigned int l, unsigned int r)
{
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
return countSetBits(n & num);
}
int main()
{
unsigned int n = 42;
unsigned int l = 2, r = 5;
cout << countSetBitsInGivenRange(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 countSetBitsInGivenRange( int n, int l, int r)
{
int num = (( 1 << r) - 1 ) ^ (( 1 << (l - 1 )) - 1 );
return countSetBits(n & num);
}
public static void main(String[] args)
{
int n = 42 ;
int l = 2 , r = 5 ;
System.out.print(countSetBitsInGivenRange(n, l, r));
}
}
|
Python3
def countSetBits(n):
count = 0
while (n):
n & = (n - 1 )
count = count + 1
return count
def countSetBitsInGivenRange(n, l, r):
num = (( 1 << r) - 1 ) ^ (( 1 << (l - 1 )) - 1 )
return countSetBits(n & num)
n = 42
l = 2
r = 5
ans = countSetBitsInGivenRange(n, l, r)
print (ans)
|
C#
using System;
class GFG {
static int countSetBits( int n)
{
int count = 0;
while (n>0) {
n &= (n - 1);
count++;
}
return count;
}
static int countSetBitsInGivenRange( int n,
int l, int r)
{
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
return countSetBits(n & num);
}
public static void Main()
{
int n = 42;
int l = 2, r = 5;
Console.WriteLine(countSetBitsInGivenRange(n, l, r));
}
}
|
PHP
<?php
function countSetBits( $n )
{
$count = 0;
while ( $n )
{
$n &= ( $n - 1);
$count ++;
}
return $count ;
}
function countSetBitsInGivenRange( $n , $l , $r )
{
$num = ((1 << $r ) - 1) ^
((1 << ( $l - 1)) - 1);
return countSetBits( $n & $num );
}
$n = 42;
$l = 2;
$r = 5;
echo countSetBitsInGivenRange( $n , $l , $r );
?>
|
Javascript
<script>
function countSetBits(n)
{
let count = 0;
while (n > 0) {
n &= (n - 1);
count++;
}
return count;
}
function countSetBitsInGivenRange(n, l, r)
{
let num = ((1 << r) - 1) ^
((1 << (l - 1)) - 1);
return countSetBits(n & num);
}
let n = 42;
let l = 2, r = 5;
document.write(countSetBitsInGivenRange(n, l, r));
</script>
|
Output:
2
Time Complexity: O(logn)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...