Given two positive integers N and K, the task is to count the numbers from the range [1, N] whose Kth bit from the right, i.e. LSB, is the rightmost set bit.
Examples:
Input: N = 15, K = 2
Output: 4
Explanation:
(2)10 = (010)2, (6)10 = (110)2, (10)10 = (1010)2, (14)10 = (1110)2 have the 2nd bit from the right is set.Input: N = 10 K = 3
Output: 3
Naive Approach: The idea is to iterate over the range [1, N] and for every number in the range, check if the position of the rightmost set bit is K and print the count of such numbers.
Time Complexity: O(N LogN)
Auxiliary Space: O(1)
Efficient Approach: The idea is to find the numbers with the position of the rightmost set bit at position i at every step. Follow the steps below to solve the problem:
- Iterate over the range [1, K] using a variable, say i.
- Find a number whose rightmost set bit is ith.
- Subtract that number from N.
- Repeat the above step for all values of i.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to count the numbers in the // range [1, N] whose rightmost set bit is K int countNumberHavingKthBitSet( int N, int K)
{ // Stores the number whose
// rightmost set bit is K
int numbers_rightmost_setbit_K;
for ( int i = 1; i <= K; i++) {
// Numbers whose rightmost set bit is i
int numbers_rightmost_bit_i = (N + 1) / 2;
// Subtracting the number whose
// rightmost set bit is i, from N
N -= numbers_rightmost_bit_i;
// Since i = k, then the number whose
// rightmost set bit is K is stored
if (i == K) {
numbers_rightmost_setbit_K
= numbers_rightmost_bit_i;
}
}
cout << numbers_rightmost_setbit_K;
} // Driver Code int main()
{ int N = 15;
int K = 2;
countNumberHavingKthBitSet(N, K);
return 0;
} |
// Java program for the above approach import java.util.Arrays;
class GFG
{ // Function to count the numbers in the // range [1, N] whose rightmost set bit is K static void countNumberHavingKthBitSet( int N, int K)
{ // Stores the number whose
// rightmost set bit is K
int numbers_rightmost_setbit_K = 0 ;
for ( int i = 1 ; i <= K; i++)
{
// Numbers whose rightmost set bit is i
int numbers_rightmost_bit_i = (N + 1 ) / 2 ;
// Subtracting the number whose
// rightmost set bit is i, from N
N -= numbers_rightmost_bit_i;
// Since i = k, then the number whose
// rightmost set bit is K is stored
if (i == K)
{
numbers_rightmost_setbit_K
= numbers_rightmost_bit_i;
}
}
System.out.println(numbers_rightmost_setbit_K);
} // Driver Code static public void main(String args[])
{ int N = 15 ;
int K = 2 ;
countNumberHavingKthBitSet(N, K);
} } // This code is contributed by sanjoy_62 |
# Python3 program for the above approach # Function to count the numbers in the # range [1, N] whose rightmost set bit is K def countNumberHavingKthBitSet(N, K):
# Stores the number whose
# rightmost set bit is K
numbers_rightmost_setbit_K = 0
for i in range ( 1 , K + 1 ):
# Numbers whose rightmost set bit is i
numbers_rightmost_bit_i = (N + 1 ) / / 2
# Subtracting the number whose
# rightmost set bit is i, from N
N - = numbers_rightmost_bit_i
# Since i = k, then the number whose
# rightmost set bit is K is stored
if (i = = K):
numbers_rightmost_setbit_K = numbers_rightmost_bit_i
print (numbers_rightmost_setbit_K)
# Driver Code if __name__ = = '__main__' :
N = 15
K = 2
countNumberHavingKthBitSet(N, K)
# This code is contributed by mohit kumar 29 |
// C# program for the above approach using System;
class GFG
{ // Function to count the numbers in the
// range [1, N] whose rightmost set bit is K
static void countNumberHavingKthBitSet( int N, int K)
{
// Stores the number whose
// rightmost set bit is K
int numbers_rightmost_setbit_K = 0;
for ( int i = 1; i <= K; i++)
{
// Numbers whose rightmost set bit is i
int numbers_rightmost_bit_i = (N + 1) / 2;
// Subtracting the number whose
// rightmost set bit is i, from N
N -= numbers_rightmost_bit_i;
// Since i = k, then the number whose
// rightmost set bit is K is stored
if (i == K)
{
numbers_rightmost_setbit_K
= numbers_rightmost_bit_i;
}
}
Console.WriteLine(numbers_rightmost_setbit_K);
}
// Driver Code
static public void Main(String []args)
{
int N = 15;
int K = 2;
countNumberHavingKthBitSet(N, K);
}
} // This code is contributed by 29AjayKumar |
<script> // javascript program for the above approach // Function to count the numbers in the // range [1, N] whose rightmost set bit is K function countNumberHavingKthBitSet(N, K)
{ // Stores the number whose
// rightmost set bit is K
let numbers_rightmost_setbit_K = 0;
for (let i = 1; i <= K; i++)
{
// Numbers whose rightmost set bit is i
let numbers_rightmost_bit_i = (N + 1) / 2;
// Subtracting the number whose
// rightmost set bit is i, from N
N -= numbers_rightmost_bit_i;
// Since i = k, then the number whose
// rightmost set bit is K is stored
if (i == K)
{
numbers_rightmost_setbit_K
= numbers_rightmost_bit_i;
}
}
document.write(numbers_rightmost_setbit_K);
} // Driver Code let N = 15;
let K = 2;
countNumberHavingKthBitSet(N, K);
</script> |
4
Time Complexity: O(K)
Auxiliary Space: O(1)