C++ 位运算判断商品编号是否为2的整数次幂
好的,我们来解决这个问题。这是一个非常经典的问题:**判断一个正整数是否为 2 的整数次幂**,并且明确要求使用位运算。 ## ✅ 核心思路:位运算判断 2 的幂 如果一个数 `n` 是 2 的整数次幂(如 1, 2, 4, 8, 16...),那么它的二进制表示中 **只有一个位是 1**,其余位都是 0。 例如: - `8` (二进制 `1000`) - `16` (二进制 `10000`) 利用这个特性,有一个非常经典的位运算技巧: > **`(n & (n - 1)) == 0`** **解释**: - `n - 1` 会将 `n` 的最低位的 1 变成 0,而它后面的所有 0 变成 1。 - 例如:`8` (1000) - 1 = `7` (0111)。 - `8 & 7` = 0,说明原数只有一个 1,是 2 的幂。 - 但有一个特殊情况:`n = 0` 时,`0 & (-1) = 0`,但 0 不是 2 的幂。不过题目限定 `num ≥ 1`,所以这个问题自动规避了。 ## 💻 C++ 代码实现 ```cpp #include <iostream> using namespace std; int main() { int num; cin >> num; // 位运算判断是否为 2 的整数次幂 if ((num & (num - 1)) == 0) { cout << "yes" << endl; } else { cout << "no" << endl; } return 0; } ``` ## 🔍 分步解释 1. **输入读取**:`cin >> num;` 读取一个整数。 2. **核心判断**:`num & (num - 1)`: - 如果结果为 0,说明 `num` 是 2 的幂。 - 否则不是。 3. **输出结果**: - 如果是:输出 `yes` - 如果不是:输出 `no` ## 📊 验证示例 | 输入 | 二进制 | `num & (num-1)` | 结果 | |------|--------|----------------|------| | 8 | 1000 | 0 | yes | | 12 | 1100 | 8 (非0) | no | | 1 | 1 | 0 | yes | | 16 | 10000 | 0 | yes | | 9 | 1001 | 8 (非0) | no | ## 🛠️ 开发建议 1. **注意边界情况**:虽然题目限定 `num ≥ 1`,但生产环境中建议对 `num <= 0` 做额外处理,因为位运算公式对 0 和负数会得出错误结论。 2. **可读性**:虽然一行位运算很简洁,但建议加上注释,方便他人理解 `(num & (num - 1)) == 0` 的含义。 3. **扩展思考**:如果想判断一个数是否是 2 的幂且同时考虑性能,位运算是 O(1) 的最优解,比循环除 2 或使用对数函数更高效。 4. **安全性**:使用 `int` 注意数据范围,题目给定 `1 ≤ num ≤ 100000`,完全安全;若数据更大(如超过 2^31),需使用 `long long`。 --- ######[AI写代码神器 | 815点数解答 | 2026-07-23 16:20:20]
- JS 代码:判断“red”改值为“green”并弹窗显示结果( | 176点数解答 | 2024-05-20 21:33:04)476
- 用 JS 代码巧妙判断 a 与 b 关系:输出对应结果 ( | 47点数解答 | 2024-05-20 22:10:14)389
- Python 实现超有趣大鱼吃小鱼游戏:玩家鱼进化与生存挑战! (讯飞星火 | 390点数解答 | 2024-05-31 11:45:36)289
- Python 实现超有趣大鱼吃小鱼游戏,从初始 1 级开启进化之旅!( | 767点数解答 | 2024-05-31 11:50:29)290
- Linux脚本:巧用if条件精准判断/home/test.txt文件是否存在(阿里通义 | 356点数解答 | 2024-11-16 16:42:28)316
- Linux 脚本:轻松判断 /home/test.txt 文件是否存在及更多检查选项(讯飞星火 | 347点数解答 | 2024-11-16 16:45:35)293
- Python 实现移位与仿射密码:精准加密解密及关键逻辑解析(字节豆包 | 798点数解答 | 2024-12-18 15:55:47)332
- C++ 实现判断正整数是否为 3、5、7 倍数:模运算、输出格式与边界条件处理(DeepSeek | 185点数解答 | 2025-08-24 18:42:18)375
- C++ 实现:快速判断正整数是否为“超级整数”(字节豆包 | 239点数解答 | 2025-11-10 18:52:28)139
- C++实现:判断正整数是否为“超级整数”(字节豆包 | 242点数解答 | 2025-11-10 20:27:49)195
- C++ 实现判断正整数是否为 3、5、7 倍数,附代码详解与复杂度分析(字节豆包 | 509点数解答 | 2025-12-20 20:27:22)112
- C++判断正整数是否为3、5、7倍数:代码实现与开发注意要点(DeepSeek | 237点数解答 | 2025-12-21 21:43:13)67