# Smallest number whose set bits are maximum in a given range

Last Updated : 07 Oct, 2022

Given a positive integer ‘l‘ and ‘r‘. Find the smallest number ‘n‘ such that l <= n <= r and count of the number of set bits(number of ‘1’s in binary representation) is as 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++

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

## Python3

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

## Javascript

 ``

Output :

```3
7```

Time Complexity: O(n*log(r))
Auxiliary Space: O(1)

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

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

 ``

## Javascript

 ``

Output :

```3
7```

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

Previous
Next