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