Given a number n containing only 1 set bit in its binary representation, the task is to find the position of the only set bit. If there are 0 or more than 1 set bits, then return -1.
Note: Position of set bit '1' should be counted starting with 1 from the LSB side in the binary representation of the number.
Examples:-
Input: n = 2
Output: 2
Explanation: Binary representation of 2 is 10. We can observe that the only set bit is at position 2 from LSB.Input: n = 5
Output: -1
Explanation: Binary representation of 5 is 101. There are 2 set bits, so return -1.
Condition for numbers having only 1 set bit:
Numbers having only one set bit will be a power of 2 number ( example, 20 = 1, 21 = 10, 22 = 100, 23 = 1000).
When you subtract 1 from such a number, all bits after the set bit (including the set bit itself) flip (e.g., 4 =Â
100, 3 =Â011). Performing a bitwise AND betweenÂn andÂn-1 results inÂ0 ifÂn is a power of 2, as the single set bit cancels out.Â
Table of Content
Using Left Shift Operator - O(log(n)) time and O(1) space
The idea is to use a loop where we left shift the numberÂ
1Â and perform a bitwise AND operation withÂn. If the result is non-zero, the position of the set bit is determined by the number of shifts performed.
Dry run for n = 2 (binary = 10) :
- Check (n == 0 => false) OR ((n & (n - 1)) != 0)
(n & (n - 1)) = (2 & 1) = 0 => (0 != 0) = false
So (false OR false = false), hence continue. - Initialize pos = 1, val = 1 (binary: 01)
- (val & n) = (1 & 2) = 0 so condition true, enter loop
val = val << 1 = 1 << 1 = 2 (binary: 10), pos = 2 - (val & n) = (2 & 2) = 2 so condition false, exit loop
Final answer is: pos = 2
#include <bits/stdc++.h>
using namespace std;
int findPosition(int n)
{
// Check if n has exactly one set bit
if (n == 0 || (n & (n - 1)) != 0)
return -1;
int pos = 1;
int val = 1;
while ((val & n) == 0)
{
// shifting left
val = val << 1;
pos++;
}
return pos;
}
// Main function
int main()
{
int n = 2;
cout << findPosition(n);
return 0;
}
class GfG {
static int findPosition(int n)
{
// Check if n has exactly one set bit
if (n == 0 || (n & (n - 1)) != 0)
return -1;
int pos = 1;
int val = 1;
while ((val & n) == 0) {
// Shifting left
val = val << 1;
pos++;
}
return pos;
}
// Main function
public static void main(String[] args)
{
int n = 2;
System.out.println(findPosition(n));
}
}
def findPosition(n):
# Check if n has exactly one set bit
if n == 0 or (n & (n - 1)) != 0:
return -1
pos = 1
val = 1
while (val & n) == 0:
# Shifting left
val = val << 1
pos += 1
return pos
# Driver Code
if __name__ == "__main__":
n = 2
print(findPosition(n))
using System;
class GfG {
static int findPosition(int n) {
// Check if n has exactly one set bit
if (n == 0 || (n & (n - 1)) != 0) return -1;
int pos = 1;
int val = 1;
while ((val & n) == 0) {
// shifting left
val = val << 1;
pos++;
}
return pos;
}
// Main function
static void Main() {
int n = 2;
Console.WriteLine(findPosition(n));
}
}
function findPosition(n) {
// Check if n has exactly one set bit
if (n === 0 || (n & (n - 1)) !== 0) return -1;
let pos = 1;
let val = 1;
while ((val & n) === 0) {
// Shifting left
val = val << 1;
pos++;
}
return pos;
}
// Driver Code
let n = 2;
console.log(findPosition(n));
Output
2
Using Right Shift Operator - O(log(n)) time and O(1) space
The idea is to right shift the numberÂ
n until the rightmost bit becomesÂ1. The number of shifts required to reach this point gives the position of the set bit.
Dry run for n = 2 (binary = 10) :
- Check (n == 0 => false) OR ((n & (n - 1)) != 0)
(n & (n - 1)) = (2 & 1) = 0 => (0 != 0) = false
So (false OR false = false), hence continue. - Initialize pos = 1
- (n & 1) = (2 & 1) = 0 so condition is true, enter loop
n = n >> 1 = 2 >> 1 = 1 (binary: 01), pos = 2 - (n & 1) = (1 & 1) = 1 so condition is false, exit loop
Final answer is: pos = 2
#include <bits/stdc++.h>
using namespace std;
int findPosition(int n)
{
// Check if n has exactly one set bit
if (n == 0 || (n & (n - 1)) != 0)
return -1;
int pos = 1;
while ((n & 1) == 0)
{
// Shifting right
n = n >> 1;
pos++;
}
return pos;
}
// Main function
int main()
{
int n = 2;
cout << findPosition(n);
return 0;
}
class GfG {
static int findPosition(int n)
{
// Check if n has exactly one set bit
if (n == 0 || (n & (n - 1)) != 0)
return -1;
int pos = 1;
while ((n & 1) == 0) {
// Shifting right
n = n >> 1;
pos++;
}
return pos;
}
// Main function
public static void main(String[] args)
{
int n = 2;
System.out.println(findPosition(n));
}
}
def findPosition(n):
# Check if n has exactly one set bit
if n == 0 or (n & (n - 1)) != 0:
return -1
pos = 1
while (n & 1) == 0:
# Shifting right
n = n >> 1
pos += 1
return pos
# Driver code
if __name__ == "__main__":
n = 2
print(findPosition(n))
using System;
class GfG {
static int findPosition(int n)
{
// Check if n has exactly one set bit
if (n == 0 || (n & (n - 1)) != 0)
return -1;
int pos = 1;
while ((n & 1) == 0) {
// Shifting right
n = n >> 1;
pos++;
}
return pos;
}
// Main function
static void Main()
{
int n = 2;
Console.WriteLine(findPosition(n));
}
}
function findPosition(n)
{
// Check if n has exactly one set bit
if (n === 0 || (n & (n - 1)) !== 0)
return -1;
let pos = 1;
while ((n & 1) === 0) {
// Shifting right
n = n >> 1;
pos++;
}
return pos;
}
// Driver code
let n = 2;
console.log(findPosition(n));
Output
2
Using Log Operator - O(log n) time and O(1) space
The idea is to use the mathematical property that the position of the only set bit in a numberÂ
n (which is a power of 2) can be found by taking the base-2 logarithm ofÂn and adding 1 (since the position is 1-based).
#include <bits/stdc++.h>
using namespace std;
int findPosition(int n)
{
// Check if n has exactly one set bit
if (n == 0 || (n & (n - 1)) != 0)
return -1;
// Find position of the set bit using log2
return log2(n) + 1;
}
// Main function
int main()
{
int n = 2;
cout << findPosition(n);
return 0;
}
class GfG {
static int findPosition(int n)
{
// Check if n has exactly one set bit
if (n == 0 || (n & (n - 1)) != 0)
return -1;
// Find position of the set bit using log2
return (int)(Math.log(n) / Math.log(2)) + 1;
}
// Main function
public static void main(String[] args)
{
int n = 2;
System.out.println(findPosition(n));
}
}
import math
def findPosition(n):
# Check if n has exactly one set bit
if n == 0 or (n & (n - 1)) != 0:
return -1
# Find position of the set bit using log2
return int(math.log2(n)) + 1
# Driver code
if __name__ == "__main__":
n = 2
print(int(findPosition(n)))
using System;
class GfG {
static int findPosition(int n)
{
// Check if n has exactly one set bit
if (n == 0 || (n & (n - 1)) != 0)
return -1;
// Find position of the set bit using log2
return (int)(Math.Log(n) / Math.Log(2)) + 1;
}
// Main function
static void Main()
{
int n = 2;
Console.WriteLine(findPosition(n));
}
}
function findPosition(n) {
// Check if n has exactly one set bit
if (n === 0 || (n & (n - 1)) !== 0) return -1;
// Find position of the set bit using log2
return Math.log2(n) + 1;
}
// Driver code
let n = 2;
console.log(Math.floor(findPosition(n)));
Output
2
Related Article: