Smallest number whose set bits are maximum in a given range

Given a positive integer ‘l‘ and ‘r‘. Find the smallest number ‘n‘ such that l <= n <= r and count of number of set bits(number of ‘1’s in binary representation) is maximum as possible.
Examples :

Input: 1 4
Output: 3
Explanation:
Binary representation from '1' to '4':
110 = 0012
210 = 0102
310 = 0112
110 = 1002
Thus number '3' has maximum set bits = 2

Input: 1 10
Output: 7

Simple approach is to traverse from ‘l’ to ‘r’ and count the set bits for each ‘x'(l <= n <= r) and print the number whose count is maximum among them. Time complexity of this approach is O(n*log(r)).

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find number whose set
// bits are maximum among 'l' and 'r'
#include <bits/stdc++.h>
using namespace std;
  
// Returns smallest number whose set bits
// are maximum in given range.
int countMaxSetBits(int left, int right)
{
    // Initialize the maximum count and
    // final answer as 'num'
    int max_count = -1, num;
    for (int i = left; i <= right; ++i) {
        int temp = i, cnt = 0;
  
        // Traverse for every bit of 'i'
        // number
        while (temp) {
            if (temp & 1)
                ++cnt;
            temp >>= 1;
        }
  
        // If count is greater than previous
        // calculated max_count, update it
        if (cnt > max_count) {
            max_count = cnt;
            num = i;
        }
    }
    return num;
}
  
// Driver code
int main()
{
    int l = 1, r = 5;
    cout << countMaxSetBits(l, r) << "\n";
  
    l = 1, r = 10;
    cout << countMaxSetBits(l, r);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find number whose set
// bits are maximum among 'l' and 'r'
class gfg
{
      
  
// Returns smallest number whose set bits
// are maximum in given range.
static int countMaxSetBits(int left, int right)
{
    // Initialize the maximum count and
    // final answer as 'num'
    int max_count = -1, num = 0;
    for (int i = left; i <= right; ++i) 
    {
        int temp = i, cnt = 0;
  
        // Traverse for every bit of 'i'
        // number
        while (temp > 0)
        {
            if (temp % 2 == 1)
                ++cnt;
            temp >>= 1;
        }
  
        // If count is greater than previous
        // calculated max_count, update it
        if (cnt > max_count)
        {
            max_count = cnt;
            num = i;
        }
    }
    return num;
}
  
// Driver code
public static void main(String[] args) 
{
    int l = 1, r = 5;
    System.out.println(countMaxSetBits(l, r));
  
    l = 1; r = 10;
    System.out.print(countMaxSetBits(l, r));
}
}
  
// This code has been contributed by 29AjayKumar

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python code to find number whose set
# bits are maximum among 'l' and 'r'
  
def countMaxSetBits( left, right):
    max_count = -1
    for i in range(left, right+1):
        temp = i
        cnt = 0
  
        # Traverse for every bit of 'i'
        # number
        while temp:
            if temp & 1:
                cnt +=1
            temp = temp >> 1
          
        # If count is greater than previous
        # calculated max_count, update it
        if cnt > max_count:
            max_count = cnt
            num=i
    return num
  
# driver code 
l = 1
r = 5
print(countMaxSetBits(l, r))
l = 1
r = 10
print(countMaxSetBits(l, r)) 
  
# This code is contributed by "Abhishek Sharma 44"

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find number whose set
// bits are maximum among 'l' and 'r'
using System;
      
class gfg
{
      
// Returns smallest number whose set bits
// are maximum in given range.
static int countMaxSetBits(int left, int right)
{
    // Initialize the maximum count and
    // final answer as 'num'
    int max_count = -1, num = 0;
    for (int i = left; i <= right; ++i) 
    {
        int temp = i, cnt = 0;
  
        // Traverse for every bit of 'i'
        // number
        while (temp > 0)
        {
            if (temp % 2 == 1)
                ++cnt;
            temp >>= 1;
        }
  
        // If count is greater than previous
        // calculated max_count, update it
        if (cnt > max_count)
        {
            max_count = cnt;
            num = i;
        }
    }
    return num;
}
  
// Driver code
public static void Main(String[] args) 
{
    int l = 1, r = 5;
    Console.WriteLine(countMaxSetBits(l, r));
  
    l = 1; r = 10;
    Console.Write(countMaxSetBits(l, r));
}
}
  
/* This code contributed by PrinciRaj1992 */

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find number 
// whose set bits are maximum
// among 'l' and 'r'
  
// Returns smallest number 
// whose set bits are maximum
// in given range.
  
function countMaxSetBits($left, $right)
{
    // Initialize the maximum 
    // count and final answer 
    // as 'num'
    $max_count = -1; $num;
    for ($i = $left; $i <= $right; ++$i
    {
        $temp = $i; $cnt = 0;
  
        // Traverse for every 
        // bit of 'i' number
        while ($temp
        {
            if ($temp & 1)
                ++$cnt;
            $temp >>= 1;
        }
  
        // If count is greater than
        // previous calculated 
        // max_count, update it
        if ($cnt > $max_count
        {
            $max_count = $cnt;
            $num = $i;
        }
    }
    return $num;
}
  
// Driver code
$l = 1; $r = 5;
echo countMaxSetBits($l, $r), "\n";
  
$l = 1; $r = 10;
echo countMaxSetBits($l, $r);
      
// This code is contributed by m_kit
?>

chevron_right



Output :

3
7

Efficient approach is to use bit-manipulation. Instead of iterating for every number from ‘l’ to ‘r’, iterate only after updating the desired number(‘num’) i.e., take the bitwise ‘OR’ of number with the consecutive number. For instance,

Let l = 2, and r = 10
1. num = 2
2. x = num OR (num + 1)
       = 2 | 3 = 010 | 011 = 011
   num = 3(011)
3. x = 3 | 4 = 011 | 100 = 111
   num = 7(111)
4. x = 7 | 8 = 0111 | 1000 = 1111
   Since 15(11112) is greater than
   10, thus stop traversing for next number.
5. Final answer = 7 

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find number whose set
// bits are maximum among 'l' and 'r'
#include <bits/stdc++.h>
using namespace std;
  
// Returns smallest number whose set bits
// are maximum in given range.
int countMaxSetBits(int left, int right)
{
    while ((left | (left + 1)) <= right)
        left |= left + 1;
  
    return left;
}
  
// Driver code
int main()
{
    int l = 1, r = 5;
    cout << countMaxSetBits(l, r) << "\n";
  
    l = 1, r = 10;
    cout << countMaxSetBits(l, r) ;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find number 
// whose set bits are maximum 
// among 'l' and 'r'
import java.io.*;
  
class GFG 
{
      
    // Returns smallest number 
    // whose set bits are 
    // maximum in given range.
    static int countMaxSetBits(int left, 
                               int right)
    {
    while ((left | (left + 1)) <= right)
        left |= left + 1;
  
    return left;
    }
  
// Driver code
public static void main (String[] args) 
{
    int l = 1;
    int r = 5;
    System.out.println(countMaxSetBits(l, r));
  
    l = 1;
    r = 10;
    System.out.println(countMaxSetBits(l, r));
}
}
  
// This code is contributed by @ajit

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python code to find number whose set
# bits are maximum among 'l' and 'r'
  
def countMaxSetBits( left, right):
      
    while(left | (left+1)) <= right:
        left |= left+1
    return left
      
# driver code
l = 1
r = 5
print(countMaxSetBits(l, r))
l = 1
r = 10
print(countMaxSetBits(l, r)) 
  
# This code is contributed by "Abhishek Sharma 44"

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find number 
// whose set bits are maximum 
// among 'l' and 'r'
using System;
  
class GFG
{
      
    // Returns smallest number 
    // whose set bits are 
    // maximum in given range.
    static int countMaxSetBits(int left, 
                               int right)
    {
    while ((left | (left + 1)) <= right)
        left |= left + 1;
  
    return left;
    }
  
// Driver code
static public void Main ()
{
    int l = 1;
    int r = 5;
    Console.WriteLine(countMaxSetBits(l, r));
      
    l = 1;
    r = 10;
    Console.WriteLine(countMaxSetBits(l, r));
}
}
  
// This code is contributed by @ajit

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find number 
// whose set bits are maximum
// among 'l' and 'r'
  
// Returns smallest number
// whose set bits are
// maximum in given range.
function countMaxSetBits($left
                         $right)
{
    while (($left | ($left + 1)) <= $right)
        $left |= $left + 1;
  
    return $left;
}
  
// Driver code
$l = 1 ; $r = 5;
echo countMaxSetBits($l, $r) , "\n";
  
$l = 1; $r = 10;
echo countMaxSetBits($l, $r) ;
  
// This code is contributed by aj_36
?>

chevron_right



Output :

3
7

Time complexity: O(log(n))
Auxiliary space: O(1)



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.





Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.