Given a number having only one ‘1’ and all other ’0’s in its binary representation, find position of the only set bit. Source: Microsoft Interview | 18

The idea is to start from rightmost bit and one by one check value of every bit. Following is detailed algorithm.

**1) **If number is power of two then and then only its binary representation contains only one ‘1’. That’s why check whether given number is power of 2 or not. If given number is not power of 2, then print error message and exit.

**2)** Initialize two variables; i = 1 (for looping) and pos = 1 (to find position of set bit)

**3)** Inside loop, do bitwise AND of i and number ‘N’. If value of this operation is true, then “pos” bit is set, so break the loop and return position. Otherwise, increment “pos” by 1 and left shift i by 1 and repeat the procedure.

## C

// C program to find position of only set bit in a given number #include <stdio.h> // A utility function to check whether n is power of 2 or not. See http://goo.gl/17Arj int isPowerOfTwo(unsigned n) { return n && (! (n & (n-1)) ); } // Returns position of the only set bit in 'n' int findPosition(unsigned n) { if (!isPowerOfTwo(n)) return -1; unsigned i = 1, pos = 1; // Iterate through bits of n till we find a set bit // i&n will be non-zero only when 'i' and 'n' have a set bit // at same position while (!(i & n)) { // Unset current bit and set the next bit in 'i' i = i << 1; // increment position ++pos; } return pos; } // Driver program to test above function int main(void) { int n = 16; int pos = findPosition(n); (pos == -1)? printf("n = %d, Invalid numbern", n): printf("n = %d, Position %d n", n, pos); n = 12; pos = findPosition(n); (pos == -1)? printf("n = %d, Invalid numbern", n): printf("n = %d, Position %d n", n, pos); n = 128; pos = findPosition(n); (pos == -1)? printf("n = %d, Invalid numbern", n): printf("n = %d, Position %d n", n, pos); return 0; }

**Output : **

n = 16, Position 5 n = 12, Invalid number n = 128, Position 8

Following is **another method** for this problem. The idea is to one by one right shift the set bit of given number ‘n’ until ‘n’ becomes 0. Count how many times we shifted to make ‘n’ zero. The final count is position of the set bit.

## C

// C program to find position of only set bit in a given number #include <stdio.h> // A utility function to check whether n is power of 2 or not int isPowerOfTwo(unsigned n) { return n && (! (n & (n-1)) ); } // Returns position of the only set bit in 'n' int findPosition(unsigned n) { if (!isPowerOfTwo(n)) return -1; unsigned count = 0; // One by one move the only set bit to right till it reaches end while (n) { n = n >> 1; // increment count of shifts ++count; } return count; } // Driver program to test above function int main(void) { int n = 0; int pos = findPosition(n); (pos == -1)? printf("n = %d, Invalid numbern", n): printf("n = %d, Position %d n", n, pos); n = 12; pos = findPosition(n); (pos == -1)? printf("n = %d, Invalid numbern", n): printf("n = %d, Position %d n", n, pos); n = 128; pos = findPosition(n); (pos == -1)? printf("n = %d, Invalid numbern", n): printf("n = %d, Position %d n", n, pos); return 0; }

## PHP

<?php // PHP program to find position of // only set bit in a given number // A utility function to check // whether n is power of 2 or not function isPowerOfTwo($n) { return $n && (! ($n & ($n - 1))); } // Returns position of the // only set bit in 'n' function findPosition($n) { if (!isPowerOfTwo($n)) return -1; $count = 0; // One by one move the only set // bit to right till it reaches end while ($n) { $n = $n >> 1; // increment count of shifts ++$count; } return $count; } // Driver Code $n = 0; $pos = findPosition($n); if(($pos == -1) == true) echo "n = ", $n, ",", " Invalid number", "\n"; else echo "n = ", $n, ",", " Position ", $pos, "\n"; $n = 12; $pos = findPosition($n); if (($pos == -1) == true) echo "n = ", $n, ",", " Invalid number", "\n"; else echo "n = ", $n, " Position ", $pos, "\n"; $n = 128; $pos = findPosition($n); if(($pos == -1) == true) echo "n = ", $n, ",", " Invalid number","\n"; else echo "n = ", $n, ",", " Position ", $pos, "\n"; // This code is contributed by ajit ?>

**Output :**

n = 0, Invalid number n = 12, Invalid number n = 128, Position 8

**We can also use log base 2 to find the position**. Thanks to Arunkumar for suggesting this solution.

## C

#include <stdio.h> unsigned int Log2n(unsigned int n) { return (n > 1)? 1 + Log2n(n/2): 0; } int isPowerOfTwo(unsigned n) { return n && (! (n & (n-1)) ); } int findPosition(unsigned n) { if (!isPowerOfTwo(n)) return -1; return Log2n(n) + 1; } // Driver program to test above function int main(void) { int n = 0; int pos = findPosition(n); (pos == -1)? printf("n = %d, Invalid numbern", n): printf("n = %d, Position %d n", n, pos); n = 12; pos = findPosition(n); (pos == -1)? printf("n = %d, Invalid numbern", n): printf("n = %d, Position %d n", n, pos); n = 128; pos = findPosition(n); (pos == -1)? printf("n = %d, Invalid numbern", n): printf("n = %d, Position %d n", n, pos); return 0; }

## Python3

# Python program to find position # of only set bit in a given number def Log2n(n): if (n > 1): return (1 + Log2n(n/2)) else: return 0 # A utility function to check # whether n is power of 2 or not def isPowerOfTwo(n): return n and (not (n & (n-1)) ) def findPosition(n): if (not isPowerOfTwo(n)): return -1 return Log2n(n) + 1 # Driver program to test above function n = 0 pos = findPosition(n) if(pos == -1): print("n =", n, ", Invalid number") else: print("n = ", n, ", Position ", pos) n = 12 pos = findPosition(n) if(pos == -1): print("n =", n, ", Invalid number") else: print("n = ", n, ", Position ", pos) n = 128 pos = findPosition(n) if(pos == -1): print("n = ", n, ", Invalid number") else: print("n = ", n, ", Position ", pos) # This code is contributed # by Sumit Sudhakar

## PHP

<?php // PHP program to find position // of only set bit in a given number function Log2n($n) { return ($n > 1) ? 1 + Log2n($n / 2) : 0; } function isPowerOfTwo($n) { return $n && (! ($n & ($n - 1))); } function findPosition($n) { if (!isPowerOfTwo($n)) return -1; return Log2n($n) + 1; } // Driver Code $n = 0; $pos = findPosition($n); if(($pos == -1) == true) echo "n =", $n, ", " , " Invalid number", "\n"; else echo "n = ",$n, ",", " Position n", $pos,"\n"; $n = 12; $pos = findPosition($n); if(($pos == -1) == true) echo "n = ", $n,"," , " Invalid number","\n"; else echo "n =", $n,",", " Position", $pos, "\n"; // Driver Code $n = 128; $pos = findPosition($n); if(($pos == -1) == true) echo "n = ", $n, ",", " Invalid number","\n"; else echo "n = ", $n, ",", " Position ",$pos, "\n"; // This code is contributed by aj_36 ?>

**Output :**

n = 0, Invalid number n = 12, Invalid number n = 128, Position 8

This article is compiled by **Narendra Kangralkar**. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.