javascriptfloating-point

What is the best way to determine if a given number is a power of two?


Is there a more effective way to return true if n is a power of two or false if not?

function isPowerOfTwo(n) {
  return Math.pow(2, Math.round(Math.log(n) / Math.log(2)));
}

Solution

  • You can actually use ECMAScript5 Math.log:

    function powerOfTwo(x) {
        return (Math.log(x)/Math.log(2)) % 1 === 0;
    }
    

    Remember, in math, to get a logarithm with an arbitrary base, you can just divide log10 of the operand (x in this case) by log10 of the base. And then to see if the number is a regular integer (and not a floating point), just check if the remainder is 0 by using the modulus % operator.

    In ECMAScript6 you can do something like this:

    function powerOfTwo(x) {
        return Math.log2(x) % 1 === 0;
    }
    

    See the MDN docs for Math.log2.