LeetCode 231. Power of Two

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

Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.

题意:给定一个整数,判断其是否为2的n次方。

方法一:直接判断。

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

方法二:利用2的n次方数的二进制形式的特点:2的n次方数的二进制只有高位1个1,剩下均为0.

例:十进制:1,二进制:1; 

  十进制:2,二进制:10;

  十进制:4,二进制:100;

  十进制:8,二进制:1000;

 判断n的最低位是否为1,然后将n右移一位,判断n是否只存在唯一一个1

public boolean isPowerOfTwo(int n) {
        if (n <= 0)
            return false;
        while (n != 0) {
            int bit = n & 1;//判断最低位是否为1,如果最低位为1,则bit=1;否则bit=0
            n = n >>> 1;//n向右移一位
            if (bit == 1 && n != 0) {//未右移前的n最低位为1,且右移一位后的n'不为0。说明未右移前的n至少存在两个1
                return false;
            }
        }
        return true;
    }

方法三:使用n&(n-1)来判断一个数是否是2的方幂

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

 关于n&(n-1)

n&(n-1)可以将n的二进制表示中的最低位为1的改为0(即将n的二进制中的最后一个1改为0)。因此,如果n的二进制只有1个1,经过n&(n-1)就会变成0了。

&的运算规则:仅当对应位的两个数都为1时,结果才为1;否则为0。

例:4的二进制是100,4 - 1 = 3,3的二进制是11,4 & 3 = 000. 将4的二进制100中的最低位的1(100的最低位的1即其仅有的1)变成了0

  5的二进制是101,5 - 1 = 4,4的二进制是100,5 & 4 = 100. 将5的二进制101中的最低位的1变成了0

原文地址:https://www.cnblogs.com/zeroingToOne/p/8186009.html