Open In App

JavaScript program to check whether a given number is power of 2

Last Updated : 04 Nov, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Given a positive integer n, write a function to find if it is a power of 2 or not

Examples:

Input: n = 4
Output: Yes
Explanation: 22 = 4


Input: n = 32 Output: Yes Explanation: 25 = 32

To solve the problem follow the below idea:

A simple method for this is to simply take the log of the number on base 2 and if you get an integer then the number is the power of 2

Example: Below is the implementation of the above approach:

Javascript




<script>
    function isPowerOfTwo(n) {
        if (n == 0)
            return false;
  
        return parseInt((Math.ceil((Math.log(n) / Math.log(2)))))
            == parseInt((Math.floor(((Math.log(n) / Math.log(2))))));
    }
  
    // Driver Code
  
    if (isPowerOfTwo(31))
        console.log("Yes");
    else
        console.log("No");
  
    if (isPowerOfTwo(64))
        console.log("Yes");
    else
        console.log("No");
</script>


Output:

No
Yes

Time Complexity: O(1).
Auxiliary Space: O(1).

Find whether a given number is a power of 2 using the division operator:

To solve the problem follow the below idea:

Another solution is to keep dividing the number by two, i.e, do n = n/2 iteratively. In any iteration, if n%2 becomes non-zero and n is not 1 then n is not a power of 2. If n becomes 1 then it is a power of 2.

Example 1: Below is the implementation of the above approach:

Javascript




<script>
    function isPowerOfTwo(n) {
        if (n == 0)
            return 0;
        while (n != 1) {
            if (n % 2 != 0)
                return 0;
            n = n / 2;
        }
        return 1;
    }
  
    isPowerOfTwo(31) ? console.log("Yes") : console.log("No");
    isPowerOfTwo(64) ? console.log("Yes") : console.log("No");
</script>


Output:

No
Yes

Time Complexity: O(log N).
Auxiliary Space: O(1).

Example 2: Below is the recursive implementation of the above approach:

Javascript




<script>
    function powerOf2(n) {
        // base cases
        // '1' is the only odd number 
        // which is a power of 2(2^0) 
        if (n == 1)
            return true;
  
        // all other odd numbers are
        // not powers of 2
        else if (n % 2 != 0 ||
            n == 0)
            return false;
  
        // recursive function call
        return powerOf2(n / 2);
    }
  
    // Driver Code
    //True
    var n = 64;
  
    //False
    var m = 12;
  
    if (powerOf2(n) == true)
        console.log("True" + "\n");
    else console.log("False" + "\n");
  
    if (powerOf2(m) == true)
        console.log("True" + "\n");
    else
        console.log("False" + "\n");
</script>


Output:

True
False

Time Complexity: O(log N).
Auxiliary Space: O(log N).

Find whether a given number is a power of 2 by checking the count of set bits:

To solve the problem follow the below idea:

All power of two numbers has only a one-bit set. So count the no. of set bits and if you get 1 then the number is a power of 2. Please see Count set bits in an integer for counting set bits.

Example: Below is the implementation of the above approach:

Javascript




<script>
    function isPowerofTwo(n) {
        let cnt = 0;
        while (n > 0) {
            if ((n & 1) == 1) {
                cnt++; // if n&1 == 1 keep incrementing cnt
                // variable
            }
            n = n >> 1; // keep dividing n by 2 using right
            // shift operator
        }
        if (cnt == 1) {
            // if cnt = 1 only then it is power of 2
            return true;
        }
        return false;
    }
  
    // Driver code
  
    if (isPowerofTwo(30) == true)
        console.log("Yes");
    else
        console.log("No");
  
    if (isPowerofTwo(128) == true)
        console.log("Yes");
    else
        console.log("No");
</script>


Output:

No
Yes

Time Complexity: O(N).
Auxiliary Space: O(1).

Find whether a given number is a power of 2 using the AND(&) operator:

To solve the problem follow the below idea:

If we subtract a power of 2 numbers by 1 then all unset bits after the only set bit become set, and the set bit becomes unset.
For example for 4 ( 100) and 16(10000), we get the following after subtracting 1
3 –> 011
15 –> 01111

So, if a number n is a power of 2 then bitwise & of n and n-1 will be zero. We can say n is a power of 2 or not based on the value of n&(n-1). The expression n&(n-1) will not work when n is 0. To handle this case also, our expression will become n& (!n&(n-1))

Example: Below is the implementation of the above approach:

Javascript




<script>
    function isPowerOfTwo(x) {
        /* First x in the below expression is 
        for the case when x is 0 */
        return x != 0 && ((x & (x - 1)) == 0);
    }
  
    // Driver method
    console.log(isPowerOfTwo(31) ? "Yes" : "No");
    console.log((isPowerOfTwo(64) ? "Yes" : "No"));
</script>


Output:

No
Yes

Time Complexity: O(1).
Auxiliary Space: O(1).

Find whether a given number is a power of 2 using the AND(&) and NOT(~) operators:

To solve the problem follow the below idea:

Another way is to use the logic to find the rightmost bit set of a given number and then check if (n & (~(n-1))) is equal to n or not

Example: Below is the implementation of the above approach:

Javascript




<script>
    function isPowerofTwo(n) {
        if (n == 0)
            return false;
        if ((n & (~(n - 1))) == n)
            return true;
        return false;
    }
  
    if (isPowerofTwo(30) == true)
        console.log("Yes");
    else
        console.log("No");
  
    if (isPowerofTwo(128) == true)
        console.log("Yes");
    else
        console.log("No");</script>


Output:

No
Yes

Time Complexity: O(1).
Auxiliary Space: O(1).

Find whether a given number is a power of 2 using Brian Kernighan’s algorithm:

To solve the problem follow the below idea:

As we know that the number which will be the power of two have only one set bit, therefore when we do bitwise AND with the number which is just less than the number which can be represented as the power of (2) then the result will be 0.

Example: 4 can be represented as (2^2 ),
(4 & 3)=0 or in binary (100 & 011=0)

Example: Below is the implementation of the above approach:

Javascript




<script>
    function isPowerofTwo(n) {
        return (n != 0) && ((n & (n - 1)) == 0);
    }
  
    /* Function to check if x is power of 2*/
    if (isPowerofTwo(30)) {
        console.log("Yes");
    }
    else {
        console.log("No");
    }
  
    if (isPowerofTwo(128)) {
        console.log("Yes");
    }
    else {
        console.log("No");
    }


Output:

No
Yes

Time Complexity: O(1).
Auxiliary Space: O(1).



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads