342. 4的幂
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true
;否则,返回 false
。
整数 n
是 4 的幂次方需满足:存在整数 x
使得 n == 4x
示例 1:
输入:n = 16
输出:true
示例 2:
输入:n = 5
输出:false
示例 3:
输入:n = 1
输出:true
提示:
-231 <= n <= 231 - 1
进阶:
- 你能不使用循环或者递归来完成本题吗?
代码与思路
我们把思路转化成第一步,判断是否是2的幂,第二步,再判断是否是4的幂,就可以比较简单的求出答案。
第一步
先来一个数如果是2的幂次方,那么它的二进制表示最前方只有一个1。
值 | 8 | 4 | 2 | 1 |
---|---|---|---|---|
2的0次方 | 1 | |||
2的1次方 | 1 | 0 | ||
2的2次方 | 1 | 0 | 0 | |
2的3次方 | 1 | 0 | 0 | 0 |
判断一个数是不是2的幂次方,用到了这个公式n & (n-1)
,其中&
表示按位与运算。该位运算技巧可以直接将n二进制表示的最低位1移除。
8----10000
7----01111
&----00000
因为2的n次方的二进制表示只有一个1。我们把它移除了(就像上面把数字8中的一移除),如果n是正整数并且n&(n-1)=0
,那么n就是2的幂。
代码
bool isPowerOfTwo1(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
第二步
表格
值 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
2的幂 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 | ||
4的幂 | 4^2 | 4^1 | 4^0 |
如果 n 是 4 的幂,那么 n 的二进制表示中有且仅有一个 1,并且这个 1 出现在从低位开始的第偶数个二进制位上。
那如何知道它的偶数位上是不是1呢。
我们可以构造一个整数mask,它的所有偶数二进制都是0,所有奇数二进制位都是1。将n和mask进行按位与运算,如果结果为0,说明n二进制表示中的1出现在偶数位置,否则出现在奇数的位置。
mask----10101010101010101010101010101010
用16进制表示
mask---0xaaaaaaaa
说明,因为10的二进制为1010
,所以一个10可以表示4位二进制,8个a就可以表示32位二进制数。
8----1000
&----1010
得---1000
代码
bool isPowerOfFour(int n)
{
return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0;
}