342. 4的幂
使用数学方法
如果一个数是4的幂次方,那么它一定可以表示为2的幂次方乘以4的幂次方。而2的幂次方在二进制表示中只有一个1,所以只需要判断n是否可以被4整除,并且n/4是否也是4的幂次方即可。
class Solution:def isPowerOfFour(self, n: int) -> bool:if n <= 0:return Falsewhile n % 4 == 0:n //= 4return n == 1
也可以通过位运算来解决这个问题。如果一个数是4的幂次方,那么它的二进制表示中一定只有一位是1,其余位都是0。而这个1的位置一定是在奇数位上(从右往左数,最右边的位为第0位)。所以我们只需要判断这个数的二进制表示中是否只有一个1即可。
class Solution:def isPowerOfFour(self, n: int) -> bool:return n > 0 and n & (n - 1) == 0 and n & 0x55555555 == n
代码解释:
n > 0
:确保n是正数,因为负数和0显然不是4的幂次方。n & (n - 1) == 0
:通过位运算判断n的二进制表示中是否只有一个1。如果n是2的幂次方,那么它的二进制表示中一定只有一个1,其余位都是0。而n-1则是将n的最低位的1变为0,并将所有更低的位变为1。所以,如果n是2的幂次方,那么n & (n - 1)的结果一定是0。n & 0x55555555 == n
:通过位运算判断n的二进制表示中1的位置是否在奇数位上。0x55555555是一个32位的数,其中所有奇数位都是1,偶数位都是0。如果n的二进制表示中1的位置在奇数位上,那么n & 0x55555555的结果一定等于n。