判断一个数是否是2的幂次方

 (num & num - 1) == 0
在 Java 中判断一个是否为 **2幂次方** 是一个常见的位运算问题。我们可以通过多种方法来实现,其中最高效的是使用 **位运算**。 --- ### ✅ 方法一:位运算(最优解) ```java public class PowerOfTwo { public static boolean isPowerOfTwo(int n) { // 注意:0 和负不是 2 的幂 return n > 0 && (n & (n - 1)) == 0; } public static void main(String[] args) { System.out.println(isPowerOfTwo(1)); // true (2^0) System.out.println(isPowerOfTwo(2)); // true (2^1) System.out.println(isPowerOfTwo(16)); // true (2^4) System.out.println(isPowerOfTwo(0)); // false System.out.println(isPowerOfTwo(-8)); // false System.out.println(isPowerOfTwo(18)); // false } } ``` #### 🔍 解释: - `(n & (n - 1)) == 0` 是关键。 - 对于 2 的幂来说,其二进制表示只有一个 `1`,例如: - `1 = 0b0001` - `2 = 0b0010` - `4 = 0b0100` - `8 = 0b1000` - 如果 `n` 是 2 的幂,那么 `n - 1` 会将这个唯一的 `1` 变成 `0`,并将后面的 `0` 全部变成 `1`,如: - `8 (0b1000)` → `7 (0b0111)` - `n & (n - 1)` 就是 `0`。 - 所以 `(n & (n - 1)) == 0` 可以判断这一点。 - 同时要确保 `n > 0`,因为 0 和负不能是 2 的幂。 --- ### 📌 方法二:使用 Math.log(不推荐) 虽然也可以使用对判断: ```java public static boolean isPowerOfTwo(int n) { if (n <= 0) return false; double log = Math.log(n) / Math.log(2); return Math.floor(log) == log; } ``` 但这种方法存在浮点精度问题,不推荐用于精确判断。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值