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
```

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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++

 `// C++ program to find number whose set ` `// bits are maximum among 'l' and 'r' ` `#include ` `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; ` `} `

Java

 `// 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 `

Python 3

 `# 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" `

C#

 `// 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 */`

PHP

 `>= 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 ` `?> `

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.
```

C++

 `// C++ program to find number whose set ` `// bits are maximum among 'l' and 'r' ` `#include ` `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; ` `} `

Java

 `// 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 `

Python3

 `# 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" `

C#

 `// 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 `

PHP

 ` `

Output :

```3
7
```

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

GeeksforGeeks has prepared a complete interview preparation course with premium videos, theory, practice problems, TA support and many more features. Please refer Placement 100 for details

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 :

1

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