Write a function that, for a given no n, finds a number p which is greater than or equal to n and is the smallest power of 2.
Examples :
Input: n = 5
Output: 8Input: n = 17
Output: 32Input : n = 32
Output: 32
Method 1: Using log2(number)
- Calculate the log2(N) and store it into a variable say ‘a’
- Check if pow(2, a) is equals to N
- Return, N
- Otherwise, return pow(2, a + 1)
Below is the implementation of the above approach:
C++
// C++ program to find// smallest power of 2// greater than or equal to n#include <bits/stdc++.h>using namespace std;long long nearestPowerOf2(long long N){ long long a = log2(N); if (pow(2, a) == N) return N; return pow(2, a + 1);}// Driver Codeint main(){ unsigned int n = 5; cout << nearestPowerOf2(n); return 0;}// This code is contributed by hkdass001 |
Java
/*package whatever //do not write package name here */import java.io.*;public class GFG { public static long nearestPowerOf2(long N) { long a = (int)(Math.log(N) / Math.log(2)); if (Math.pow(2, a) == N) return N; return (long) Math.pow(2, a + 1); } // Driver Code public static void main (String[] args) { long n = 5; System.out.println(nearestPowerOf2(n)); }}// This code is contributed by Ajax |
Python3
#Python program to find#smallest power of 2#greater than or equal to nimport math# Function to find the smallest power of 2# greater than or equal to ndef nearestPowerOf2(N): # Calculate log2 of N a = int(math.log2(N)) # If 2^a is equal to N, return N if 2**a == N: return N # Return 2^(a + 1) return 2**(a + 1)# Main functionif __name__ == "__main__": # Input number n = 5 # Call the nearestPowerOf2 function print(nearestPowerOf2(n)) |
C#
using System;public class GFG { public static long nearestPowerOf2(long N) { long a = (int)(Math.Log(N) / Math.Log(2)); if (Math.Pow(2, a) == N) return N; return (long) Math.Pow(2, a + 1); } // Driver Code public static void Main (String[] args) { long n = 5; Console.WriteLine(nearestPowerOf2(n)); }}// This code contributed by SRJ |
Javascript
// Function to find the smallest power of 2// greater than or equal to Nfunction nearestPowerOf2(N){ // Calculate log2 of N var a = Math.floor(Math.log2(N)); // If 2^a is equal to N, return N if (Math.pow(2, a) === N) { return N; } // Return 2^(a + 1) return Math.pow(2, a + 1);}// Main function // Input number var n = 5; // Call the nearestPowerOf2 function console.log(nearestPowerOf2(n)); |
8
Time Complexity: O(1)
Auxiliary Space: O(1)
Example :
Let us try for 17
pos = 5
p = 32
Method 2 (By getting the position of only set bit in result )
/* If n is a power of 2 then return n */
1 If (n & !(n&(n-1))) then return n
2 Else keep right shifting n until it becomes zero
and count no of shifts
a. Initialize: count = 0
b. While n ! = 0
n = n>>1
count = count + 1
/* Now count has the position of set bit in result */
3 Return (1 << count)
Example :
Let us try for 17
count = 5
p = 32
C++
// C++ program to find// smallest power of 2// greater than or equal to n#include <bits/stdc++.h>using namespace std;unsigned int nextPowerOf2(unsigned int n){ unsigned count = 0; // First n in the below condition // is for the case where n is 0 if (n && !(n & (n - 1))) return n; while( n != 0) { n >>= 1; count += 1; } return 1 << count;}// Driver Codeint main(){ unsigned int n = 0; cout << nextPowerOf2(n); return 0;}// This code is contributed by rathbhupendra |
C
#include<stdio.h>unsigned int nextPowerOf2(unsigned int n){unsigned count = 0;// First n in the below condition// is for the case where n is 0if (n && !(n & (n - 1))) return n;while( n != 0){ n >>= 1; count += 1;}return 1 << count;}// Driver Codeint main(){unsigned int n = 0;printf("%d", nextPowerOf2(n));return 0;} |
Java
// Java program to find// smallest power of 2// greater than or equal to nimport java.io.*;class GFG{ static int nextPowerOf2(int n) { int count = 0; // First n in the below // condition is for the // case where n is 0 if (n > 0 && (n & (n - 1)) == 0) return n; while(n != 0) { n >>= 1; count += 1; } return 1 << count; } // Driver Code public static void main(String args[]) { int n = 0; System.out.println(nextPowerOf2(n)); }}// This article is contributed// by Anshika Goyal. |
Python3
def nextPowerOf2(n): count = 0 # First n in the below # condition is for the # case where n is 0 if (n and not(n & (n - 1))): return n while( n != 0): n >>= 1 count += 1 return 1 << count# Driver Coden = 0print(nextPowerOf2(n))# This code is contributed# by Smitha Dinesh Semwal |
C#
// C# program to find smallest// power of 2 greater than// or equal to nusing System;class GFG{ static int nextPowerOf2(int n) { int count = 0; // First n in the below // condition is for the // case where n is 0 if (n > 0 && (n & (n - 1)) == 0) return n; while(n != 0) { n >>= 1; count += 1; } return 1 << count; } // Driver Code public static void Main() { int n = 0; Console.WriteLine(nextPowerOf2(n)); }}// This code is contributed by anuj_67. |
PHP
<?php// PHP program to find smallest// power of 2 greater than or// equal to nfunction nextPowerOf2($n){$count = 0;// First n in the below condition// is for the case where n is 0if ($n && !($n&($n - 1))) return $n;while($n != 0){ $n >>= 1; $count += 1;}return 1 << $count;}// Driver Code$n = 0;echo (nextPowerOf2($n));// This code is contributed by vt_m?> |
Javascript
<script>// JavaScript program to find// smallest power of 2// greater than or equal to nfunction nextPowerOf2(n){ var count = 0; // First n in the below condition // is for the case where n is 0 if (n && !(n & (n - 1))) return n; while( n != 0) { n >>= 1; count += 1; } return 1 << count;}// Driver Codevar n = 0;document.write(nextPowerOf2(n)); </script> |
1
Time Complexity: O(log n)
Auxiliary Space: O(1)
Method 3(Shift result one by one)
Thanks to coderyogi for suggesting this method . This method is a variation of method 2 where instead of getting count, we shift the result one by one in a loop.
C++
// C++ program to find smallest// power of 2 greater than or// equal to n#include<bits/stdc++.h>using namespace std;unsigned int nextPowerOf2(unsigned int n){ unsigned int p = 1; if (n && !(n & (n - 1))) return n; while (p < n) p <<= 1; return p;}// Driver Codeint main(){ unsigned int n = 5; cout << nextPowerOf2(n); return 0;}// This code is contributed by rathbhupendra |
C
#include<stdio.h>unsigned int nextPowerOf2(unsigned int n){ unsigned int p = 1; if (n && !(n & (n - 1))) return n; while (p < n) p <<= 1; return p;}// Driver Codeint main(){unsigned int n = 5;printf("%d", nextPowerOf2(n));return 0;} |
Java
// Java program to find smallest// power of 2 greater than or// equal to nimport java.io.*;class GFG{ static int nextPowerOf2(int n) { int p = 1; if (n > 0 && (n & (n - 1)) == 0) return n; while (p < n) p <<= 1; return p; } // Driver Code public static void main(String args[]) { int n = 5; System.out.println(nextPowerOf2(n)); }}// This article is contributed// by Anshika Goyal. |
Python3
def nextPowerOf2(n): p = 1 if (n and not(n & (n - 1))): return n while (p < n) : p <<= 1 return p;# Driver Coden = 5print(nextPowerOf2(n));# This code is contributed by# Smitha Dinesh Semwal |
C#
// C# program to find smallest// power of 2 greater than or// equal to nusing System;class GFG{ static int nextPowerOf2(int n) { int p = 1; if (n > 0 && (n & (n - 1)) == 0) return n; while (p < n) p <<= 1; return p; } // Driver Code public static void Main() { int n = 5; Console.Write(nextPowerOf2(n)); }}// This code is contributed by Smitha. |
PHP
<?phpfunction nextPowerOf2($n){ $p = 1; if ($n && !($n & ($n - 1))) return $n; while ($p < $n) $p <<= 1; return $p;}// Driver Code$n = 5;echo ( nextPowerOf2($n));// This code is contributed by vt_m.?> |
Javascript
<script>// Program to find smallest// power of 2 greater than or// equal to nfunction nextPowerOf2( n){ p = 1; if (n && !(n & (n - 1))) return n; while (p < n) p <<= 1; return p;} // Driver Code n = 5; document.write (nextPowerOf2(n)); //This code is contributed by simranarora5sos</script> |
8
Time Complexity: O(log(n))
Auxiliary Space: O(1)
Method 4(Customized and Fast)
1. Subtract n by 1
n = n -1
2. Set all bits after the leftmost set bit.
/* Below solution works only if integer is 32 bits */
n = n | (n >> 1);
n = n | (n >> 2);
n = n | (n >> 4);
n = n | (n >> 8);
n = n | (n >> 16);
3. Return n + 1
Example :
Steps 1 & 3 of above algorithm are to handle cases
of power of 2 numbers e.g., 1, 2, 4, 8, 16,
Let us try for 17(10001)
step 1
n = n - 1 = 16 (10000)
step 2
n = n | n >> 1
n = 10000 | 01000
n = 11000
n = n | n >> 2
n = 11000 | 00110
n = 11110
n = n | n >> 4
n = 11110 | 00001
n = 11111
n = n | n >> 8
n = 11111 | 00000
n = 11111
n = n | n >> 16
n = 11110 | 00000
n = 11111
step 3: Return n+1
We get n + 1 as 100000 (32)
Program:
C++
// C++ program to // Finds next power of two// for n. If n itself is a// power of two then returns n#include <bits/stdc++.h>using namespace std; unsigned int nextPowerOf2(unsigned int n) { n--; n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; n++; return n;} // Driver Code int main() { unsigned int n = 5; cout << nextPowerOf2(n); return 0; } // This code is contributed by SHUBHAMSINGH10 |
C
#include <stdio.h>// Finds next power of two// for n. If n itself is a// power of two then returns nunsigned int nextPowerOf2(unsigned int n){ n--; n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; n++; return n;}// Driver Codeint main(){ unsigned int n = 5; printf("%d", nextPowerOf2(n)); return 0;} |
Java
// Java program to find smallest// power of 2 greater than or// equal to nimport java.io.*;class GFG{ // Finds next power of two // for n. If n itself is a // power of two then returns n static int nextPowerOf2(int n) { n--; n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; n++; return n; } // Driver Code public static void main(String args[]) { int n = 5; System.out.println(nextPowerOf2(n)); }}// This article is contributed// by Anshika Goyal. |
Python3
# Finds next power of two# for n. If n itself is a# power of two then returns ndef nextPowerOf2(n): n -= 1 n |= n >> 1 n |= n >> 2 n |= n >> 4 n |= n >> 8 n |= n >> 16 n += 1 return n# Driver program to test# above functionn = 5print(nextPowerOf2(n))# This code is contributed# by Smitha |
C#
// C# program to find smallest// power of 2 greater than or// equal to nusing System;class GFG{ // Finds next power of two // for n. If n itself is a // power of two then returns n static int nextPowerOf2(int n) { n--; n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; n++; return n; } // Driver Code public static void Main() { int n = 5; Console.WriteLine(nextPowerOf2(n)); }}// This code is contributed by anuj_67. |
PHP
<?php// PHP program to find smallest// power of 2 greater than or// equal to n// Finds next power of// two for n. If n itself// is a power of two then// returns nfunction nextPowerOf2($n){ $n--; $n |= $n >> 1; $n |= $n >> 2; $n |= $n >> 4; $n |= $n >> 8; $n |= $n >> 16; $n++; return $n;} // Driver Code $n = 5; echo nextPowerOf2($n);// This code contributed by Ajit?> |
Javascript
<script>// Javascript program to find smallest// power of 2 greater than or// equal to n // Finds next power of// two for n. If n itself// is a power of two then// returns nfunction nextPowerOf2(n){ n -= 1 n |= n >> 1 n |= n >> 2 n |= n >> 4 n |= n >> 8 n |= n >> 16 n += 1 return n} // Driver Coden = 5;document.write (nextPowerOf2(n));// This code is contributed by bunnyram19</script> |
8
Time Complexity : O(log(n))
Auxiliary Space: O(1)
Efficient approach:
If the given number is the power of two then it is the required number otherwise set only the left bit of most significant bit which gives us the required number.
C++
// C++ program to find// smallest power of 2// greater than or equal to n#include <iostream>using namespace std;long long nextPowerOf2(long long N){ // if N is a power of two simply return it if (!(N & (N - 1))) return N; // else set only the left bit of most significant bit return 0x8000000000000000 >> (__builtin_clzll(N) - 1);}// Driver Codeint main(){ long long n = 5; cout << nextPowerOf2(n); return 0;}// This code is contributed by Kasina Dheeraj. |
C
// C program to find// smallest power of 2// greater than or equal to n#include <stdio.h>long long nextPowerOf2(long long N){ // if N is a power of two simply return it if (!(N & (N - 1))) return N; // else set only the left bit of most significant bit return 0x8000000000000000 >> (__builtin_clzll(N) - 1);}// Driver Codeint main(){ long long n = 5; printf("%lld", nextPowerOf2(n)); return 0;}// This code is contributed by Kasina Dheeraj. |
Java
// Java program to find// smallest power of 2// greater than or equal to nimport java.io.*;class GFG { static long nextPowerOf2(long N) { // if N is a power of two simply return it if ((N & (N - 1)) == 0) return N; // else set only the left bit of most significant // bit as in Java right shift is filled with most // significant bit we consider return 0x4000000000000000L >> (Long.numberOfLeadingZeros(N) - 2); } // Driver Code public static void main(String args[]) { long n = 5; System.out.println(nextPowerOf2(n)); }}// This code is contributed// by Kasina Dheeraj. |
Python3
# Python program to find# smallest power of 2# greater than or equal to n#include <iostream>def nextPowerOf2(N): # if N is a power of two simply return it if not (N & (N - 1)): return N # else set only the left bit of most significant bit return int("1" + (len(bin(N)) - 2) * "0", 2)# Driver Coden = 5print(nextPowerOf2(n))# this code is contributed by phasing17 |
C#
// C# program to find// smallest power of 2// greater than or equal to nusing System;using System.Linq;class GFG { static int nextPowerOf2(int N) { // if N is a power of two simply return it if ((N & (N - 1)) == 0) return N; // else set only the left bit of most significant // bit return Convert.ToInt32( "1" + new string('0', Convert.ToString(N, 2).Length), 2); } // Driver Code public static void Main(string[] args) { int n = 5; // Function call Console.WriteLine(nextPowerOf2(n)); }}// This code is contributed// by phasing17 |
Javascript
// JavaScript program to find// smallest power of 2// greater than or equal to nfunction nextPowerOf2(N){ // if N is a power of two simply return it if (!(N & (N - 1))) return N; // else set only the left bit of most significant bit return parseInt("1" + "0".repeat(N.toString(2).length), 2);}// Driver Codelet n = 5;console.log(nextPowerOf2(n));// this code is contributed by phasing17 |
8
Time Complexity : O(1) as counting leading zeroes can cause at most O(64) time complexity.
Auxiliary Space: O(1)
Related Post :
Highest power of 2 less than or equal to given number
References :
http://en.wikipedia.org/wiki/Power_of_2
