确定给定数字是否为2的幂的最佳方法是什么?

时间:2015-06-18 19:38:01

标签: javascript

如果n是2的幂,我需要返回 true ,否则返回 false 。它应该是这样的:

function PowerOfTwo(n){
  //code here
}

这是我目前的做法:

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

还有更有效的方法吗?

7 个答案:

答案 0 :(得分:14)

来源:Bit twiddling Hacks

function powerOf2(v) {
    return v && !(v & (v - 1));
}

您只需使用当前数字按位和前一个数字。如果结果是假的,则它是2的幂。

解释在this answer

答案 1 :(得分:7)

您实际上可以使用ECMAScript5 Math.log

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

请记住,在数学中,要获得具有任意基数的对数,您可以通过log 10 <将操作数的log 10 (在这种情况下为x)除以/ sub>的基础。然后要查看数字是否是常规整数(而不是浮点数),只需使用模%运算符检查余数是否为0。

在ECMAScript6中,您可以执行以下操作:

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

请参阅Math.log2的{​​{3}}。

答案 2 :(得分:0)

使用按位运算符,这是代码效率和清洁度方面的最佳方法:

function PowerofTwo(n){
    return ((x != 0) && !(x & (x - 1)));
}

它做的是检查构成数字的位,即8看起来像这样:

1 0 0 0
在这种情况下,

x-1或7看起来像这样

0 1 1 1

当使用按位运算符&时,它会调用&amp;&amp;&amp;在数字的每一位(因此1 & 1 = 11 & 0 = 00 & 1 = 00 & 0 = 1):

 1 0 0 0
-0 1 1 1
=========
 0 0 0 0

因为使用!标志将数字转换为精确的0(或在评估为布尔值时为false)将返回正确的答案

如果您使用7之类的数字来执行此操作,它将如下所示:

 0 1 1 1
-0 1 1 0
=========
 1 1 1 0

返回大于零的数字,导致!标志接管并给出正确答案。

答案 3 :(得分:0)

function PowerOfTwo(n){
  // Exercise for reader: confirm that n is an integer
  return (n !== 0) && (n & (n - 1)) === 0;
}

答案 4 :(得分:0)

当且仅当该数字的对数基数为2时,数字才是2的幂。下面的函数计算是否为真:

d = { 
'foo' : foo,
'bar' : bar,
'baz' : baz
}

答案 5 :(得分:0)

利用ES6的Math.clz32(n)来计算从1到2³的32位整数的前导零 - 1:

function isPowerOf2(n) {
  return Math.clz32(n) < Math.clz32(n - 1);
}

答案 6 :(得分:0)

/**
 * @param {number} n
 * @return {boolean}
 */
const isPowerOfTwo = function(n) {
    if(n == 0) return false;

    while(n % 2 == 0){
        n = n/2
    }
    return n === 1
};