酷代码 AI
菜单
服务商
DeepSeek字节豆包
更多选项

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]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]