2的幂
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1输出: true解释: 20 = 1
示例 2:
输入: 16输出: true解释: 24
示例 3:
输入: 218输出: false
方法一
时间复杂度logn
public boolean isPowerOfTwo(int n) {
if (n == 0) {
return false;
}
while (n % 2 == 0) {
n /= 2;
}
return n == 1;
}
方法二:最右边的1
获取二进制中最右边的 1:x & (-x)
将二进制中最右边的 1 设置为 0:x & (x - 1)
x & (-x) 保留了最右边的 1,并将其他位设置为 0
若 x 为 2 的幂,则它的二进制表示中只包含一个 1,则有 x & (-x) = x。
public boolean isPowerOfTwo(int n) {
if (n == 0) {
return false;
}
long x = n; // -x可能在Integer.MIN_VALUE溢出
return (x & -x) == x;
}
(x & x - 1) 将最右边的1置为0,如果是2的幂,那正个数会是0
public boolean isPowerOfTwo(int n) {
if (n == 0) {
return false;
}
long x = n; // x - 1可能在Integer.MIN_VALUE溢出
return (x & x - 1) == 0;
}