JavaScript 来检查给定的数字是否是2的幂

JavaScript 来检查给定的数字是否是2的幂

给定一个正整数 n ,编写一个函数来判断它是否是2的幂

示例:

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


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

解决问题的方法如下:

一种简单的方法是将数字的对数以2为底取对数,如果得到一个整数,则该数字是2的幂。

示例: 下面是上述方法的实现:

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> 

输出:

No
Yes

时间复杂度: O(1)。

辅助空间: O(1)。

使用除法运算符确定一个给定数字是否是2的幂次方:

要解决这个问题,请遵循以下思路:

另一种解决方案是不断将数字除以二,即迭代地执行 n = n/2。在任何迭代中,如果 n%2 不为零且 n 不为1,则 n 不是2的幂次方。如果 n 变为1,则它是2的幂次方。

示例 1: 以下是上述方法的实现:

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> 

输出:

No
Yes

时间复杂度: O(log N).

辅助空间: O(1).

示例2: 以下是上述方法的递归实现:

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> 

输出:

True
False

时间复杂度: O(log N)。

辅助空间: O(log N)。

通过检查置位位数来判断给定的数是否为2的幂:

解决该问题的思路如下:

所有的2的幂都只有一个置位位。因此计算置位位数,如果得到1,则该数是2的幂。请参阅 计算整数中的置位位 以计算置位位数。

示例: 上述方法的实现如下:

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> 

输出:

No
Yes

时间复杂度: O(N)。

辅助空间: O(1)。

使用AND(&)运算符来判断一个给定的数是否是2的幂:

解决这个问题的思路如下:

如果我们将一个2的幂减去1,那么在唯一的设置位之后的所有未设置的位都将变为设置,设置位则变为未设置。

例如,对于4(100)和16(10000),我们在减去1之后得到如下结果:
3 –> 011

15 –> 01111

因此,如果一个数n是2的幂,则n和n-1的按位与运算结果将为零。根据n&(n-1)的值,我们可以判断n是否是2的幂。当n为0时,表达式n&(n-1)将不起作用。为了处理这种情况,我们的表达式将变为n&(!n&(n-1))。

示例: 下面是上述方法的实现:

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> 

输出:

No
Yes

时间复杂度: O(1)。

辅助空间: O(1)。

使用AND(&)和NOT(~)操作符确定给定数是否是2的幂次方:

解决该问题的方法如下:

另一种方法是使用逻辑来找到给定数的最右边的置位位,然后检查 (n & (~(n-1))) 是否等于 n 或不等于

示例: 下面是以上方法的实现:

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> 

输出:

No
Yes

时间复杂度: O(1)。

辅助空间: O(1)。

使用Brian Kernighan算法判断给定数字是否为2的幂:

解决这个问题的思路如下:

我们知道,2的幂次方只有一个比特位是1,因此当我们将待检测的数字与比它小1的数字按位与时,结果将为0。

例如:4可以表示为(2 ^ 2),

(4&3)=0或二进制形式(100&011 = 0)

示例: 下面是上述方法的实现:

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"); 
    } 

输出:

No
Yes

时间复杂度: O(1)。

辅助空间: O(1)。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程