# Largest number less than X having at most K set bits

Last Updated : 24 Nov, 2022

Given an integer X > 1 and an integer K > 0, the task is to find the greatest odd number < X such that the number of 1’s in its binary representation is at most K.

Examples:

Input: X = 10, K = 2
Output: 10

Input: X = 29, K = 2
Output: 24

Naive Approach: Starting from X – 1 check all the numbers below X which have at most K set bits, the first number satisfying the condition is the required answer.

Efficient Approach: is to count the set bits. If the count is less than or equal to K, return X. Otherwise, keep removing rightmost set bit while count – k does not become 0.

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach` `#include ` `using` `namespace` `std;`   `// Function to return the greatest number <= X` `// having at most K set bits.` `int` `greatestKBits(``int` `X, ``int` `K)` `{` `    ``int` `set_bit_count = __builtin_popcount(X);` `    ``if` `(set_bit_count <= K)` `        ``return` `X;`   `    ``// Remove rightmost set bits one` `    ``// by one until we count becomes k` `    ``int` `diff = set_bit_count - K;` `    ``for` `(``int` `i = 0; i < diff; i++)` `        ``X &= (X - 1);`   `    ``// Return the required number` `    ``return` `X;` `}`   `// Driver code` `int` `main()` `{` `    ``int` `X = 21, K = 2;` `    ``cout << greatestKBits(X, K);` `    ``return` `0;` `}`

## Java

 `// Java implementation of the approach` `import` `java.io.*; ` `  `  `class` `GFG { `   `    ``// Function to return the greatest number <= X` `    ``// having at most K set bits.` `     ``int` `greatestKBits(``int` `X, ``int` `K)` `     ``{` `       ``int` `set_bit_count = Integer.bitCount(X);` `       ``if` `(set_bit_count <= K)` `            ``return` `X;`   `        ``// Remove rightmost set bits one` `        ``// by one until we count becomes k` `        ``int` `diff = set_bit_count - K;` `        ``for` `(``int` `i = ``0``; i < diff; i++)` `            ``X &= (X - ``1``);`   `        ``// Return the required number` `        ``return` `X;` `    ``}`   `// Driver code` `public` `static` `void` `main (String[] args) ` `{ ` `    ``int` `X = ``21``, K = ``2``;` `    ``GFG g=``new` `GFG();` `      ``System.out.print(g.greatestKBits(X, K));` `}`   `//This code is contributed by Shivi_Aggarwal` `}`

## Python3

 `# Python 3 implementation of the approach`   `# Function to return the greatest ` `# number <= X having at most K set bits.` `def` `greatestKBits(X, K):` `    ``set_bit_count ``=` `bin``(X).count(``'1'``)` `    ``if` `(set_bit_count <``=` `K):` `        ``return` `X`   `    ``# Remove rightmost set bits one` `    ``# by one until we count becomes k` `    ``diff ``=` `set_bit_count ``-` `K` `    ``for` `i ``in` `range``(``0``, diff, ``1``):` `        ``X &``=` `(X ``-` `1``)`   `    ``# Return the required number` `    ``return` `X`   `# Driver code` `if` `__name__ ``=``=` `'__main__'``:` `    ``X ``=` `21` `    ``K ``=` `2` `    ``print``(greatestKBits(X, K))` `    `  `# This code is contributed by` `# Shashank_Sharma`

## C#

 `// C# implementation of the above approach ` `using` `System;`   `class` `GFG` `{ ` `    ``// Function to get no of set ` `    ``// bits in binary representation ` `    ``// of positive integer n ` `    ``static` `int` `countSetBits(``int` `n) ` `    ``{ ` `        ``int` `count = 0; ` `        ``while` `(n > 0) ` `        ``{ ` `            ``count += n & 1; ` `            ``n >>= 1; ` `        ``} ` `        ``return` `count; ` `    ``} ` `    `  `    ``// Function to return the greatest number <= X ` `    ``// having at most K set bits. ` `    ``static` `int` `greatestKBits(``int` `X, ``int` `K) ` `    ``{ ` `        ``int` `set_bit_count = countSetBits(X); ` `        ``if` `(set_bit_count <= K) ` `        ``return` `X; `   `        ``// Remove rightmost set bits one ` `        ``// by one until we count becomes k ` `        ``int` `diff = set_bit_count - K; ` `        ``for` `(``int` `i = 0; i < diff; i++) ` `            ``X &= (X - 1); `   `        ``// Return the required number ` `        ``return` `X; ` `    ``} `   `    ``// Driver code ` `    ``public` `static` `void` `Main() ` `    ``{ ` `        ``int` `X = 21, K = 2; ` `        ``Console.WriteLine(greatestKBits(X, K)); ` `        `  `    ``} ` `} `   `// This code is contributed by Ryuga`

## Javascript

 ``

Output

`20`

Time Complexity: O(log2X), as the time complexity of __builtin_popcount(X) is O(log2X)
Auxiliary Space: O(1)

Previous
Next