Position of the K-th set bit in a number

Given two numbers N and K, The task is to find the index of the K-th set bit in the number from the right. 
Note: Indexing in the binary representation starts from 0 from the right. For example in the binary number ā€œ000011ā€, the first set bit is at index 0 from the right, and the second set bit is at index 1 from the right.
Examples: 
 

Input: N = 15, K = 3
Output: 2
15 is "1111", hence the third bit is at index 2 from right. 

Input:  N = 19, K = 2
Output: 1
19 is "10011", hence the second set bit is at index 1 from right. 

 

Approach: Initialize a counter 0, and increase it if the last bit is set in the number. For accessing the next bit, right-shift the number by 1. When the counterā€™s value is equal to K, then we return the index of the number which was being incremented on every right shift. 
Below is the implementation of the above approach: 
 

C++




// C++ program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function that returns the Kth set bit
int FindIndexKthBit(int n, int k)
{
    int cnt = 0;
    int ind = 0;
 
    // Traverse in the binary
    while (n) {
 
        // Check if the last
        // bit is set or not
        if (n & 1)
            cnt++;
 
        // Check if count is equal to k
        // then return the index
        if (cnt == k)
            return ind;
 
        // Increase the index
        // as we move right
        ind++;
 
        // Right shift the number by 1
        n = n >> 1;
    }
 
    return -1;
}
 
// Driver Code
int main()
{
    int n = 15, k = 3;
    int ans = FindIndexKthBit(n, k);
    if (ans != -1)
        cout << ans;
    else
        cout << "No k-th set bit";
    return 0;
}


Java




// Java program to implement
// the above approach
import java.util.*;
 
class GFG
{
 
// Function that returns the Kth set bit
static int FindIndexKthBit(int n, int k)
{
    int cnt = 0;
    int ind = 0;
 
    // Traverse in the binary
    while (n > 0)
    {
 
        // Check if the last
        // bit is set or not
        if ((n & 1 ) != 0)
            cnt++;
 
        // Check if count is equal to k
        // then return the index
        if (cnt == k)
            return ind;
 
        // Increase the index
        // as we move right
        ind++;
 
        // Right shift the number by 1
        n = n >> 1;
    }
 
    return -1;
}
 
// Driver Code
public static void main(String args[])
{
    int n = 15, k = 3;
    int ans = FindIndexKthBit(n, k);
    if (ans != -1)
        System.out.println(ans);
    else
        System.out.println("No k-th set bit");
}
}
 
// This code is contributed by
// Surendra_Gangwar


Python3




# Python3 implementation of the approach
 
# Function that returns the Kth set bit
def FindIndexKthBit(n, k):
 
    cnt, ind = 0, 0
     
    # Traverse in the binary
    while n > 0:
 
        # Check if the last
        # bit is set or not
        if n & 1:
            cnt += 1
 
        # Check if count is equal to k
        # then return the index
        if cnt == k:
            return ind
 
        # Increase the index
        # as we move right
        ind += 1
 
        # Right shift the number by 1
        n = n >> 1
     
    return -1
 
# Driver Code
if __name__ == "__main__":
 
    n, k = 15, 3
    ans = FindIndexKthBit(n, k)
     
    if ans != -1:
        print(ans)
    else:
        print("No k-th set bit")
         
# This code is contributed by
# Rituraj Jain


C#




// C# program to implement
// the above approach
using System;
 
class GFG
{
 
// Function that returns the Kth set bit
static int FindIndexKthBit(int n, int k)
{
    int cnt = 0;
    int ind = 0;
 
    // Traverse in the binary
    while (n > 0)
    {
 
        // Check if the last
        // bit is set or not
        if ((n & 1 ) != 0)
            cnt++;
 
        // Check if count is equal to k
        // then return the index
        if (cnt == k)
            return ind;
 
        // Increase the index
        // as we move right
        ind++;
 
        // Right shift the number by 1
        n = n >> 1;
    }
 
    return -1;
}
 
// Driver Code
public static void Main()
{
    int n = 15, k = 3;
    int ans = FindIndexKthBit(n, k);
    if (ans != -1)
        Console.WriteLine(ans);
    else
        Console.WriteLine("No k-th set bit");
}
}
 
// This code is contributed by
// Code_Mech.


PHP




<?php
// PHP program to implement
// the above approach
 
// Function that returns the Kth set bit
function FindIndexKthBit($n, $k)
{
    $cnt = 0;
    $ind = 0;
 
    // Traverse in the binary
    while ($n)
    {
 
        // Check if the last
        // bit is set or not
        if ($n & 1)
            $cnt++;
 
        // Check if count is equal to k
        // then return the index
        if ($cnt == $k)
            return $ind;
 
        // Increase the index
        // as we move right
        $ind++;
 
        // Right shift the number by 1
        $n = $n >> 1;
    }
 
    return -1;
}
 
// Driver Code
$n = 15;
$k = 3;
 
$ans = FindIndexKthBit($n, $k);
 
if ($ans != -1)
    echo $ans;
else
    echo "No k-th set bit";
 
// This code is contributed by Ryuga
?>


Javascript




<script>
    // Javascript program to implement
    // the above approach
     
    // Function that returns the Kth set bit
    function FindIndexKthBit(n, k)
    {
        let cnt = 0;
        let ind = 0;
 
        // Traverse in the binary
        while (n > 0) {
 
            // Check if the last
            // bit is set or not
            if (n & 1 > 0)
                cnt++;
 
            // Check if count is equal to k
            // then return the index
            if (cnt == k)
                return ind;
 
            // Increase the index
            // as we move right
            ind++;
 
            // Right shift the number by 1
            n = n >> 1;
        }
 
        return -1;
    }
     
    let n = 15, k = 3;
    let ans = FindIndexKthBit(n, k);
    if (ans != -1)
        document.write(ans);
    else
        document.write("No k-th set bit");
 
</script>


Output: 

2

 

Time Complexity: O(logN), as we are using a while loop to traverse and in each traversal we are right shifting N by 1 place which is equivalent to floor division of N by 2. So, the effective time will be 1+1/2+1/4+ā€¦..+1/2^N which is equivalent to logN.

Auxiliary Space: O(1), as we are not using any extra space.



Contact Us