Given a positive number n, find the next highest power of 2. If n itself is a power of 2, return n.

For example,

Input:  n = 20
Output: 32
 
Input:  n = 16
Output: 16

Practice this problem

Approach 1

The idea is to unset the rightmost bit of n until only one bit is left, which will be the last set bit of the given number. To handle the case when n is the power of 2, initially decrement n by 1. Note that this operation will not impact output as we are only concerned about the last set bit of n.

Following is the C++, Java, and Python implementation of the idea:

C++


Download  Run Code

Output:

The next power of 2 is 128

Java


Download  Run Code

Output:

The next power of 2 is 128

Python


Download  Run Code

Output:

The next power of 2 is 128

Approach 2

The idea is to decrement n by 1 (to handle the case when n itself is the power of 2) and run a loop by initializing the result by 2. We double the result value at each iteration of the loop and divide n in half and continue the loop till n becomes 0.

The algorithm can be implemented as follows in C++, Java, and Python:

C++


Download  Run Code

Output:

The next power of 2 is 128

Java


Download  Run Code

Output:

The next power of 2 is 128

Python


Download  Run Code

Output:

The next power of 2 is 128

Approach 3

The idea is to calculate position p of the last set bit of n and return a number with its p+1 bit set. Following is the C++, Java, and Python program that demonstrates it:

C++


Download  Run Code

Output:

The next power of 2 is 32

Java


Download  Run Code

Output:

The next power of 2 is 32

Python


Download  Run Code

Output:

The next power of 2 is 32

Approach 4

The idea is to set all bits on the right-hand side of the most significant set bit to 1 and then increment the value by 1 to “rollover” to two’s nearest power. For instance, consider number 20. We convert its binary representation 00010100 to 00011111 and add 1 to it, which results in the next power of 20. i.e., (00011111 + 1) = 00100000.

This approach is demonstrated below in C++, Java, and Python:

C++


Download  Run Code

Output:

The next power of 2 is 256

Java


Download  Run Code

Output:

The next power of 2 is 256

Python


Download  Run Code

Output:

The next power of 2 is 256

How does right shift and bitwise OR operation works?

Let’s take an example of 131, which is 10000011 in binary:

n--;             // 10000011 ——> 10000010
n |= n >> 1;    // 10000010 | 01000001 = 11000011
n |= n >> 2;    // 11000011 | 00110000 = 11110011
n |= n >> 4;    // 11110011 | 00001111 = 11111111
n |= n >> 8;    // … (At this point, all bits are 1, so further bitwise OR
n |= n >> 16;   // operations produce no effect)
n++;             // 11111111 ——> 100000000

There’s one bit in the 9th position, which represents 28, which is indeed the next largest power of 2. Each of the shifts overlaps all the existing 1 bits in the number with some previously untouched 0’s, eventually producing the total number of 1 bit equal to the total number of bits in the original number. Adding one to that value produces a new power of 2.

 
There are several other solutions possible for this problem.

 
References: https://graphics.stanford.edu/~seander/bithacks.html#SwappingBitsXOR