![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0655be923969b7df75cda4c58ee65245.png)
位运算
解题思路:时间复杂度O(
1
1
1),空间复杂度O(
1
1
1) |
---|
- 4的幂,一定是2的幂,所以它具备2的幂的性质,二进制中只有1个1
- 因此使用和2的幂一样的方法,请参考
- 但是4的幂还有额外的条件,我们观察4的幂的形式
-
4
0
=
1
=
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0001
4^0 = 1 = 0000,0000,0000,0000,0000,0000,0000,0001
40=1=0000,0000,0000,0000,0000,0000,0000,0001
-
4
1
=
4
=
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0100
4^1 = 4 = 0000,0000,0000,0000,0000,0000,0000,0100
41=4=0000,0000,0000,0000,0000,0000,0000,0100
-
4
2
=
16
=
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0001
,
0000
4^2 =16= 0000,0000,0000,0000,0000,0000,0001,0000
42=16=0000,0000,0000,0000,0000,0000,0001,0000
-
4
3
=
64
=
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0100
,
0000
4^3 =64= 0000,0000,0000,0000,0000,0000,0100,0000
43=64=0000,0000,0000,0000,0000,0000,0100,0000
- 我们发现每个1都出现在了偶数位置上[…,7位置,6位置,5位置,4位置,3位置,2位置,1位置,0位置]
-
4
0
=
1
=
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0001
4^0 = 1 = 0000,0000,0000,0000,0000,0000,0000,0001
40=1=0000,0000,0000,0000,0000,0000,0000,0001中的1出现在0位置
-
4
1
=
4
=
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0100
4^1 = 4 = 0000,0000,0000,0000,0000,0000,0000,0100
41=4=0000,0000,0000,0000,0000,0000,0000,0100中的1出现在2位置
-
4
2
=
16
=
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0001
,
0000
4^2 =16= 0000,0000,0000,0000,0000,0000,0001,0000
42=16=0000,0000,0000,0000,0000,0000,0001,0000中的1出现在4位置
-
4
3
=
64
=
0000
,
0000
,
0000
,
0000
,
0000
,
0000
,
0100
,
0000
4^3 =64= 0000,0000,0000,0000,0000,0000,0100,0000
43=64=0000,0000,0000,0000,0000,0000,0100,0000中的1出现在6位置
- 因此,我们需要额外在2的幂的基础上,加一条规则,那就是n的二进制串中的1,是否在偶数位置上。
- 我们将奇数位置标识出来:(10101010101010101010101010101010)二进制中,只对奇数位置操作
- 当然如果转换为16进制,它会比较好看一点:其16进制形式为0xaaaaaaaa
- 如果n&0xaaaaaaaa ==0,就说明n的二进制中的1,只出现在偶数位置上。因为如果出现在奇数位置上,两个二进制为都是1,与操作过后的结果一定也是1.
- 当然我们可以标识偶数位置(01010101010101010101010101010101) = 0x55555555
- 如果n& 0x55555555 = n的话,就说明n中1的位置正好在偶数位置上
- 将n的二进制串,取出末位1,剩下的二进制串结果为0,就说明是2的幂。然后判断n&0xaaaaaaaa是否为0,来判断其中1的位置是否在偶数位置上
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c73ac73d091b0372d474b175b98aa7fa.png)
class Solution {
public boolean isPowerOfFour(int n) {
return n > 0 &&
(n & (n-1)) == 0 &&
(n & 0xaaaaaaaa) == 0;
}
}
- 只取出n的二进制中末位的1,如果取出的1的十进制和n的十进制相同,说明n是2的幂(二进制中只有1个1)。然后通过判断是否n& 0x55555555 == n,来确定n的二进制中的1是否只出现在偶数位置上
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/aea58dced5ae28c1f9fde110af1b5a52.png)
class Solution {
public boolean isPowerOfFour(int n) {
return n > 0 &&
(n & (-n)) == n &&
(n & 0x55555555) == n;
}
}