如果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;
}
还有更有效的方法吗?
答案 0 :(得分:14)
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 = 1
,1 & 0 = 0
,0 & 1 = 0
,0 & 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
};