跳转至

231. Power of Two

Leetcode Math Bit Manipulation

Given an integer, write a function to determine if it is a power of two.

Example 1:

Input: 1
Output: true 
Explanation: 20 = 1

Example 2:

Input: 16
Output: true
Explanation: 24 = 16

Example 3:

Input: 218
Output: false

分析

2的幂。判断一个整数n是否是2的幂,最直接的方法就是不断除以2,看余数是否是1。但需要注意n=1时,虽然1除以2的余数是1,但是它是2的幂。注意应该使用右移运算(n >>> 1),而不是除法(n/2),因为位运算比除法快得多。

使用递归的代码:

public boolean isPowerOfTwo(int n) {
    if (n <= 0) return false;
    if (n == 1) return true;
    if (n % 2 != 0) return false;
    return isPowerOfTwo(n >>> 1);
}

使用迭代的代码:

public boolean isPowerOfTwo(int n) {
    if (n <= 0) return false;
    while (n > 1) {
        if (n % 2 == 1) return false;
        n >>= 1;
    }
    return n == 1 ? true : false;
}

仔细思考一下如果一个数是2的幂的话,它的二进制表示有什么特点?有且只有一个数是1,其他都是0。利用此特点,一一检查n的二进制表示:有且只有一个1。于是就可以用LeetCode 191. Number of 1 Bits中描述的所有方法。

public boolean isPowerOfTwo(int n) {
    if (n <= 0) return false;
    while ((n != 0) && ((n & 1) != 1))
        n >>= 1;
    n >>= 1;
    return n == 0; 
}

使用n&(n-1)技巧:

public boolean isPowerOfTwo(int n) {
    if (n <= 0) return false;
    return (n & (n - 1)) == 0; 
}