题目
从标准输入读入一个正整数 n,判断它是否为 2 的整数次幂(如 1, 2, 4, 8, 16...)。
输入格式:一行输入一个正整数 n。
输出格式:若是 2 的幂输出 yes,否则输出 no,末尾换行。
数据范围与约定:1 ≤ n ≤ 2×109。
思路与算法
1. 位运算性质 n & (n - 1)
2 的幂在二进制表示下有且仅有最高位一个 1(如 8 = 1000₂)。当对其减 1 时,该二进制位变为 0,所有低位变为 1(7 = 0111₂)。两数按位与必为 0:n & (n - 1) == 0。
2. 正数边界
0 不是 2 的幂,因此完整判断为:n > 0 && (n & (n - 1)) == 0。运算速度达到 O(1)。
完整程序
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
// 核心位运算技巧:2 的幂在二进制中有且仅有 1 个 1
// n - 1 会将该 1 变为 0,且更低位全部变成 1
// 因此 n & (n - 1) 为 0 且 n > 0 是判定 2 的幂的充要条件
if (n > 0 && (n & (n - 1)) == 0) {
System.out.println("yes");
} else {
System.out.println("no");
}
}
}运行示例
输入:
16输出:
yes