In this blog post, I will teach you how to write C/C++ program to get position of right most set bit. After reading this post you able to write an efficient program to get position of right most set bit.
Examples,
Input : n = 9 Here's a simple ASCII representation of 9 (an 8-bit integer): 7 6 5 4 3 2 1 0 (Bit position) +---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | (Example bit values) +---+---+---+---+---+---+---+---+ ^ | 0th is the position of the rightmost set bit.
Input : n = 12 Here's a simple ASCII representation of 12 (an 8-bit integer): 7 6 5 4 3 2 1 0 (Bit position) +---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | (Example bit values) +---+---+---+---+---+---+---+---+ ^ | 2 is the position of rightmost set bit.
Let’s see the problem statements for this question.
Problem Statement:
Given an integer n, get the position of right most set Bit.
Disclaimer: Try to solve the problem yourself first otherwise it would be not worth solving this problem.
Get position of rightmost set bit using two’s complement:
The bitwise operation (n&~(n-1))
isolates the rightmost set bit in “n”. The bitwise AND operation between n
and ∼(n−1)
return only the rightmost set bit of n by turning off all other bits. Now the last steps to use log2((n&~(n-1))) to get the position of rightmost set bit.
Let’s understand this concept with an example, suppose n = 12.
Suppose n is 12, n =12 "n" in binary: 00001100 Step 1: n-1 > 11 /* n-1 would have all the bits flipped after the rightmost set bit (including the set bit). */ "n"−1 in binary: 00001011 Step 2: ∼(n−1) (Complement of n−1) ∼(n−1) in binary: 11110100 Step 3: (n & ~(n - 1)): ((00001100) & (11110100)) is 00000100 You can see in step 3 on rightmost bit is set and other bits set to 0 Step 4: log2(n & ~(n - 1)): /* calculates the position of the rightmost set bit in a given number n. */ If n is 12 it returns 2, See the pictorial representation for better understanding. Here's a simple ASCII representation of 12 (an 8-bit integer): 7 6 5 4 3 2 1 0 (Bit position) +---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | (Example bit values) +---+---+---+---+---+---+---+---+ ^ | 2 is the position of rightmost set bit.
C program to get position of right most set Bit:
#include <stdio.h> #include <math.h> /* C program to get position of right most set Bit: */ int getPositionRightMostSetBit(unsigned int n) { unsigned int hasOnlyRightSetBit = (n&~(n-1)); int posOfRightMostSetBit = (int)log2(hasOnlyRightSetBit); return posOfRightMostSetBit; } int main() { unsigned int n = 12; const unsigned int pos = getPositionRightMostSetBit(n); printf("Position = %d",pos); return 0; }
Output:
Position = 2
C++ program to get position of right most set Bit:
/* C++ program to get position of right most set Bit: */ #include <iostream> #include <math.h> int getPositionRightMostSetBit(unsigned int n) { unsigned int hasOnlyRightSetBit = (n&~(n-1)); int posOfRightMostSetBit = static_cast<int>(log2(hasOnlyRightSetBit)); return posOfRightMostSetBit; } int main() { unsigned int n = 12; const unsigned int pos = getPositionRightMostSetBit(n); std::cout<<"Right Most Set Bit Position = " << pos <<std::endl; return 0; }
Output:
Right Most Set Bit Position = 2
Position of rightmost set bit using & and >> operator:
Follow the steps below to solve the problem:
- Initialize posOfRightMostSetBit as 0 that will be used to keep track of the rightmost set bit positions.
- Enters in if condition when n is non-zero number.
- If n is non-zero number, then continue the while loop until the not found the rightmost set bit. In the while loop condition, we check the least significant bit of n using the bitwise AND operation ((n & 1) == 0).
- In the while loop, we right shift n by 1 bit position to get the next LSB and increments the variable posOfRightMostSetBit.
- Above process repeat until not get the LSB bit set.
Consider the below C program,
#include <stdio.h> /* C program to get position of right most set Bit: */ int getPositionRightMostSetBit(unsigned int n) { // Initialize position counter int posOfRightMostSetBit = 0; if(n != 0) { // Loop until the rightmost set bit is found while ((n & 1) == 0) { n >>= 1; // Right shift n by 1 posOfRightMostSetBit++; // Increment position counter } } return posOfRightMostSetBit; } int main() { unsigned int n = 1; const unsigned int pos = getPositionRightMostSetBit(n); printf("Right Most Set Bit Position = %d",pos); return 0; }
Recommended Post
- Turn off the rightmost set bit.
- Count Set bits in an Integer.
- Count Set bits in an Integer using the lookup table.
- Rotate bits of a number.
- How to set, clear or toggle a single bit in C/C++?
- Macros for Bit Manipulation in C/C++.
- 5 Ways to Check if Two Integers have Opposite Signs.
- C Program to Find whether a given integer is a power of three or not.
- Operator Precedence And Associativity In C.
- Operators in C language