# Find most significant set bit of a number

Given a number, find the most significant bit number which is set bit and which is in power of two

Examples:

```Input : 10
Output : 8
Binary representation of 10 is 1010
The most significant bit corresponds
to decimal number 8.

Input : 18
Output : 16
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

A simple solution is to one by one divide n by 2 until it becomes 0 and increment a count while doing this. This count actually represents the position of MSB.

## C++

 `// Simple CPP program to find MSB number ` `// for given n. ` `#include ` `using` `namespace` `std; ` ` `  `int` `setBitNumber(``int` `n) ` `{ ` `    ``if` `(n == 0) ` `        ``return` `0; ` ` `  `    ``int` `msb = 0; ` `    ``n = n / 2; ` `    ``while` `(n != 0) { ` `        ``n = n / 2; ` `        ``msb++; ` `    ``} ` ` `  `    ``return` `(1 << msb); ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``int` `n = 0; ` `    ``cout << setBitNumber(n); ` `    ``return` `0; ` `} `

## Java

 `// Simple Java rogram to find ` `// MSB number for given n. ` `import` `java.io.*; ` ` `  `class` `GFG { ` `    ``static` `int` `setBitNumber(``int` `n) ` `    ``{ ` `        ``if` `(n == ``0``) ` `            ``return` `0``; ` ` `  `        ``int` `msb = ``0``; ` `        ``n = n / ``2``; ` ` `  `        ``while` `(n != ``0``) { ` `            ``n = n / ``2``; ` `            ``msb++; ` `        ``} ` ` `  `        ``return` `(``1` `<< msb); ` `    ``} ` ` `  `    ``// Driver code ` `    ``public` `static` `void` `main(String[] args) ` `    ``{ ` `        ``int` `n = ``0``; ` `        ``System.out.println(setBitNumber(n)); ` `    ``} ` `} ` ` `  `// This code is contributed by ajit `

## Python3

 `# Simple Python3 program  ` `# to find MSB number ` `# for given n. ` `def` `setBitNumber(n): ` `    ``if` `(n ``=``=` `0``): ` `        ``return` `0``; ` ` `  `    ``msb ``=` `0``; ` `    ``n ``=` `int``(n ``/` `2``); ` ` `  `    ``while` `(n > ``0``): ` `        ``n ``=` `int``(n ``/` `2``); ` `        ``msb ``+``=` `1``; ` ` `  `    ``return` `(``1` `<< msb); ` ` `  `# Driver code ` `n ``=` `0``; ` `print``(setBitNumber(n)); ` `     `  `# This code is contributed  ` `# by mits `

## C#

 `// Simple C# rogram to find ` `// MSB number for given n. ` `using` `System; ` ` `  `class` `GFG { ` `    ``static` `int` `setBitNumber(``int` `n) ` `    ``{ ` `        ``if` `(n == 0) ` `            ``return` `0; ` ` `  `        ``int` `msb = 0; ` `        ``n = n / 2; ` ` `  `        ``while` `(n != 0) { ` `            ``n = n / 2; ` `            ``msb++; ` `        ``} ` ` `  `        ``return` `(1 << msb); ` `    ``} ` ` `  `    ``// Driver code ` `    ``static` `public` `void` `Main() ` `    ``{ ` `        ``int` `n = 0; ` `        ``Console.WriteLine(setBitNumber(n)); ` `    ``} ` `} ` ` `  `// This code is contributed ` `// by akt_mit `

## PHP

 ` `

Output:

```0
```

An efficient solution for a fixed size integer (say 32 bits) is to one by one set bits, then add 1 so that only the bit after MSB is set. Finally right shift by 1 and return the answer. This solution does not require any condition checking.

## C++

 `// CPP program to find MSB number for given n. ` `#include ` `using` `namespace` `std; ` ` `  `int` `setBitNumber(``int` `n) ` `{ ` `    ``// Below steps set bits after ` `    ``// MSB (including MSB) ` ` `  `    ``// Suppose n is 273 (binary ` `    ``// is 100010001). It does following ` `    ``// 100010001 | 010001000 = 110011001 ` `    ``n |= n >> 1; ` ` `  `    ``// This makes sure 4 bits ` `    ``// (From MSB and including MSB) ` `    ``// are set. It does following ` `    ``// 110011001 | 001100110 = 111111111 ` `    ``n |= n >> 2; ` ` `  `    ``n |= n >> 4; ` `    ``n |= n >> 8; ` `    ``n |= n >> 16; ` ` `  `    ``// Increment n by 1 so that ` `    ``// there is only one set bit ` `    ``// which is just before original ` `    ``// MSB. n now becomes 1000000000 ` `    ``n = n + 1; ` ` `  `    ``// Return original MSB after shifting. ` `    ``// n now becomes 100000000 ` `    ``return` `(n >> 1); ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``int` `n = 273; ` `    ``cout << setBitNumber(n); ` `    ``return` `0; ` `} `

## Java

 `// Java program to find MSB ` `// number for given n. ` ` `  `class` `GFG { ` ` `  `    ``static` `int` `setBitNumber(``int` `n) ` `    ``{ ` ` `  `        ``// Below steps set bits after ` `        ``// MSB (including MSB) ` ` `  `        ``// Suppose n is 273 (binary ` `        ``// is 100010001). It does following ` `        ``// 100010001 | 010001000 = 110011001 ` `        ``n |= n >> ``1``; ` ` `  `        ``// This makes sure 4 bits ` `        ``// (From MSB and including MSB) ` `        ``// are set. It does following ` `        ``// 110011001 | 001100110 = 111111111 ` `        ``n |= n >> ``2``; ` ` `  `        ``n |= n >> ``4``; ` `        ``n |= n >> ``8``; ` `        ``n |= n >> ``16``; ` ` `  `        ``// Increment n by 1 so that ` `        ``// there is only one set bit ` `        ``// which is just before original ` `        ``// MSB. n now becomes 1000000000 ` `        ``n = n + ``1``; ` ` `  `        ``// Return original MSB after shifting. ` `        ``// n now becomes 100000000 ` `        ``return` `(n >> ``1``); ` `    ``} ` ` `  `    ``// Driver code ` `    ``public` `static` `void` `main(String arg[]) ` `    ``{ ` `        ``int` `n = ``273``; ` `        ``System.out.print(setBitNumber(n)); ` `    ``} ` `} ` ` `  `// This code is contributed by Anant Agarwal. `

## Python3

 `# Python program to find ` `# MSB number for given n. ` ` `  `def` `setBitNumber(n): ` ` `  `    ``# Below steps set bits after ` `    ``# MSB (including MSB) ` `  `  `    ``# Suppose n is 273 (binary  ` `    ``# is 100010001). It does following ` `    ``# 100010001 | 010001000 = 110011001 ` `    ``n |``=` `n>>``1` `  `  `    ``# This makes sure 4 bits ` `    ``# (From MSB and including MSB) ` `    ``# are set. It does following ` `    ``# 110011001 | 001100110 = 111111111 ` `    ``n |``=` `n>>``2`    `  `  `    ``n |``=` `n>>``4`   `    ``n |``=` `n>>``8` `    ``n |``=` `n>>``16` `      `  `    ``# Increment n by 1 so that ` `    ``# there is only one set bit ` `    ``# which is just before original ` `    ``# MSB. n now becomes 1000000000 ` `    ``n ``=` `n ``+` `1` `  `  `    ``# Return original MSB after shifting. ` `    ``# n now becomes 100000000 ` `    ``return` `(n >> ``1``) ` ` `  `# Driver code ` ` `  `n ``=` `273`             `print``(setBitNumber(n)) ` ` `  `# This code is contributed ` `# by Anant Agarwal. `

## C#

 `// C# program to find MSB number for given n. ` `using` `System; ` ` `  `class` `GFG { ` ` `  `    ``static` `int` `setBitNumber(``int` `n) ` `    ``{ ` ` `  `        ``// Below steps set bits after ` `        ``// MSB (including MSB) ` ` `  `        ``// Suppose n is 273 (binary ` `        ``// is 100010001). It does following ` `        ``// 100010001 | 010001000 = 110011001 ` `        ``n |= n >> 1; ` ` `  `        ``// This makes sure 4 bits ` `        ``// (From MSB and including MSB) ` `        ``// are set. It does following ` `        ``// 110011001 | 001100110 = 111111111 ` `        ``n |= n >> 2; ` ` `  `        ``n |= n >> 4; ` `        ``n |= n >> 8; ` `        ``n |= n >> 16; ` ` `  `        ``// Increment n by 1 so that ` `        ``// there is only one set bit ` `        ``// which is just before original ` `        ``// MSB. n now becomes 1000000000 ` `        ``n = n + 1; ` ` `  `        ``// Return original MSB after shifting. ` `        ``// n now becomes 100000000 ` `        ``return` `(n >> 1); ` `    ``} ` ` `  `    ``// Driver code ` `    ``public` `static` `void` `Main() ` `    ``{ ` `        ``int` `n = 273; ` `        ``Console.WriteLine(setBitNumber(n)); ` `    ``} ` `} ` ` `  `// This code is contributed by Sam007. `

## PHP

 `> 1; ` ` `  `    ``// This makes sure 4 bits ` `    ``// (From MSB and including  ` `    ``// MSB) are set. It does  ` `    ``// following 110011001 |  ` `    ``// 001100110 = 111111111 ` `    ``\$n` `|= ``\$n` `>> 2; ` ` `  `    ``\$n` `|= ``\$n` `>> 4; ` `    ``\$n` `|= ``\$n` `>> 8; ` `    ``\$n` `|= ``\$n` `>> 16; ` ` `  `    ``// Increment n by 1 so  ` `    ``// that there is only  ` `    ``// one set bit which is ` `    ``// just before original ` `    ``// MSB. n now becomes  ` `    ``// 1000000000 ` `    ``\$n` `= ``\$n` `+ 1; ` ` `  `    ``// Return original MSB  ` `    ``// after shifting. n  ` `    ``// now becomes 100000000 ` `    ``return` `(``\$n` `>> 1); ` `} ` ` `  `// Driver code ` `\$n` `= 273; ` `echo` `setBitNumber(``\$n``); ` ` `  `// This code is contributed ` `// by akt_mit ` `?> `

Output:

```256
```

Time complexity is O(1).

Another Approach: Given a number n. First, find the position of the most significant set bit and then compute the value of the number with a set bit at k-th position.
Thanks Rohit Narayan for suggesting this method.

## C++

 `// CPP program to find MSB ` `// number for given n. ` `#include ` `using` `namespace` `std; ` ` `  `int` `setBitNumber(``int` `n) ` `{ ` ` `  `    ``// To find the position ` `    ``// of the most significant ` `    ``// set bit ` `    ``int` `k = (``int``)(log2(n)); ` ` `  `    ``// To return the the value ` `    ``// of the number with set ` `    ``// bit at k-th position ` `    ``return` `(``int``)(``pow``(2, k)); ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``int` `n = 273; ` `    ``cout << setBitNumber(n); ` `    ``return` `0; ` `} `

## Java

 `// Java program to find MSB ` `// number for given n. ` ` `  `class` `GFG { ` ` `  `    ``static` `int` `setBitNumber(``int` `n) ` `    ``{ ` ` `  `        ``// To find the position of the ` `        ``// most significant set bit ` `        ``int` `k = (``int``)(Math.log(n) / Math.log(``2``)); ` ` `  `        ``// To return the the value of the number ` `        ``// with set bit at k-th position ` `        ``return` `(``int``)(Math.pow(``2``, k)); ` `    ``} ` ` `  `    ``// Driver code ` `    ``public` `static` `void` `main(String arg[]) ` `    ``{ ` `        ``int` `n = ``273``; ` `        ``System.out.print(setBitNumber(n)); ` `    ``} ` `} `

## Python3

 `# Python program to find ` `# MSB number for given n. ` `import` `math ` ` `  `def` `setBitNumber(n): ` `     `  `    ``# To find the position of ` `    ``# the most significant  ` `    ``# set bit ` `    ``k ``=` `int``(math.log(n, ``2``)) ` `     `  `    ``# To return the value  ` `    ``# of the number with set  ` `    ``# bit at k-th position ` `    ``return` `2``*``*``k ` ` `  `# Driver code ` `n ``=` `273`         `print``(setBitNumber(n)) `

## C#

 `// C# program to find MSB ` `// number for given n. ` `using` `System; ` ` `  `public` `class` `GFG { ` ` `  `    ``static` `int` `setBitNumber(``int` `n) ` `    ``{ ` ` `  `        ``// To find the position of the ` `        ``// most significant set bit ` `        ``int` `k = (``int``)(Math.Log(n) / Math.Log(2)); ` ` `  `        ``// To return the the value of the number ` `        ``// with set bit at k-th position ` `        ``return` `(``int``)(Math.Pow(2, k)); ` `    ``} ` ` `  `    ``// Driver code ` `    ``static` `public` `void` `Main() ` `    ``{ ` `        ``int` `n = 273; ` `        ``Console.WriteLine(setBitNumber(n)); ` `    ``} ` `} `

## PHP

 ` `

Output:

```256
```

This article is contributed by Devanshu Agarwal. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up

Article Tags :
Practice Tags :

12

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.