P231 2的幂


image-20210530100106429
  • 今天的题比较简单,经过观察可以发现2的整数幂的二进制表示都为单独的一个1
image-20210530100244394
  • 之前了解过如果x&(x-1)就可以消掉最右侧的1,消掉之后如果等于0,就表示只有一个1
  • 0和有符号最小值属于特殊情况,直接判false(负数也不可能)
  • 剩下的就是2的整数幂
1
2
3
4
5
class Solution {
public boolean isPowerOfTwo(int n) {
return n>0&&((n&(n-1))==0);
}
}
image-20210530100636322

这里再介绍一个位运算技巧

n & (-n)

  • 其中 −n 是 n 的相反数,是一个负数。该位运算技巧可以直接获取 n 二进制表示的最低位的 1。

  • 由于负数是按照补码规则在计算机中存储的,−n 的二进制表示为 n 的二进制表示的每一位取反再加上 1,

所以如果n是2的正整数,且n&(-n)=n,n是2的整数幂

1
2
3
4
5
class Solution {
public boolean isPowerOfTwo(int n) {
return n>0&&(n==( n&(-n)));
}
}
image-20210530102230650

另一种解法

  • 当前环境下2的最大整数幂是2^30

  • 如果n是2^30的约数就是

1
2
3
4
5
class Solution {
public boolean isPowerOfTwo(int n) {
return n>0&&(1<<30)%n==0;
}
}
image-20210530102341488

← Prev P342 4的幂 | P1074元素和为目标值的子矩阵数量 Next →