Open In App

Count set bits in a range

Last Updated : 15 Jul, 2022
Comments
Improve
Suggest changes
Like Article
Like
Report

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:
 

  1. 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.
  2. Count number of set bits in the number (n & num). Refer this post.


 

C++
// C++ implementation to count set bits in the
// given range
#include <bits/stdc++.h>

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 set bits in the given range
unsigned int countSetBitsInGivenRange(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 set bits in the range
    // 'l' to 'r' in 'n'
    return countSetBits(n & num);
}

// Driver program to test above
int main()
{
    unsigned int n = 42;
    unsigned int l = 2, r = 5;
    cout << countSetBitsInGivenRange(n, l, r);
    return 0;
}
Java
// Java implementation to count set 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 set bits in the given range
    static int countSetBitsInGivenRange(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 set bits in the range
        // 'l' to 'r' in 'n'
        return countSetBits(n & num);
    }
    
    // Driver code
    public static void main(String[] args)
    {
        int n = 42;
        int l = 2, r = 5;
        
        System.out.print(countSetBitsInGivenRange(n, l, r));
    }
}

// This code is contributed by Anant Agarwal.
Python3
# Python3 implementation to count
# set 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 = count + 1
    
    return count
 
# function to count set bits in
# the given range
def countSetBitsInGivenRange(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 set bits in the range
    # 'l' to 'r' in 'n'
    return countSetBits(n & num)

# Driver program to test above
n = 42
l = 2
r = 5
ans = countSetBitsInGivenRange(n, l, r)
print (ans)

# This code is contributed by Saloni Gupta.
C#
// C# implementation to count set 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 set bits in the given range
    static int countSetBitsInGivenRange(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 set bits in the range
        // 'l' to 'r' in 'n'
        return countSetBits(n & num);
    }
    
    //Driver code
    public static void Main()
    {
        int n = 42;
        int l = 2, r = 5;
        
        Console.WriteLine(countSetBitsInGivenRange(n, l, r));
    }
}

// This code is contributed by Anant Agarwal.
PHP
<?php
// PHP implementation to count
// set bits in the given range

// Function to get no of set bits in 
// the binary representation of 'n'
function countSetBits($n)
{
    $count = 0;
    while ($n)
    {
        $n &= ($n - 1);
        $count++;
    }
    return $count;
}

// function to count set 
// bits in the given range
function countSetBitsInGivenRange($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 
    // set bits in the range
    // 'l' to 'r' in 'n'
    return countSetBits($n & $num);
}

    // Driver Code
    $n = 42;
    $l = 2;
    $r = 5;
    echo countSetBitsInGivenRange($n, $l, $r);

// This code is contributed by Ajit.
?>
JavaScript
<script>

// Javascript implementation to 
// count set bits in the
// given range

 // Function to get no of set bits in the
    // binary representation of 'n'
    function countSetBits(n)
    {
        let count = 0;
        while (n > 0) {
            n &= (n - 1);
            count++;
        }
          
        return count;
    }
  
    // function to count set 
    // bits in the given range
    function countSetBitsInGivenRange(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
        let num = ((1 << r) - 1) ^ 
                   ((1 << (l - 1)) - 1);
  
        // returns number of set 
        // bits in the range
        // 'l' to 'r' in 'n'
        return countSetBits(n & num);
    }

// driver program 

        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) 


 


Next Article
Article Tags :
Practice Tags :

Similar Reads