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

C++实现二进制转十进制:两种高效算法对比及优化指南

## 💻 C++ 二进制转十进制实现 ### 📝 问题分析 二进制整数是由 `0` 和 `1` 组成的数字串,需要按**位权展开**转换为十进制: - 从**最右侧**开始,每一位的权重为 `2^n`(n 从 0 开始递增) - 例如:`1101` = 1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 8 + 4 + 0 + 1 = 13 --- ### 🔧 完整代码实现 ```cpp #include <iostream> #include <string> #include <cmath> // 使用 pow 函数(也可以不用,用累乘更高效) using namespace std; int binaryToDecimal(const string& binary) { int decimal = 0; int power = 0; // 当前位的权重指数 // 从右向左遍历每一位 for (int i = binary.length() - 1; i >= 0; i--) { if (binary[i] == '1') { decimal += pow(2, power); // 累加权重 } power++; } return decimal; } int main() { string input; cout << "请输入二进制整数: "; cin >> input; // 验证输入是否合法(可选) for (char c : input) { if (c != '0' && c != '1') { cout << "错误:输入包含非二进制字符!" << endl; return 1; } } int result = binaryToDecimal(input); cout << "十进制结果: " << result << endl; return 0; } ``` --- ### ✨ 优化版本(不使用 pow,效率更高) ```cpp #include <iostream> #include <string> using namespace std; int binaryToDecimalOptimized(const string& binary) { int decimal = 0; // 从左侧开始,每读一位将结果乘2再加上当前位 for (char c : binary) { decimal = decimal * 2 + (c - '0'); } return decimal; } int main() { string input; cout << "请输入二进制整数: "; cin >> input; // 简单合法性检查 for (char c : input) { if (c != '0' && c != '1') { cout << "错误:输入包含非二进制字符!" << endl; return 1; } } int result = binaryToDecimalOptimized(input); cout << "十进制结果: " << result << endl; return 0; } ``` --- ### 📌 关键点解释 | 方法 | 原理 | 适用场景 | |------|------|----------| | **pow 方法** | 从右向左,每位按权展开 | 逻辑直观,便于理解位权概念 | | **累乘方法** | 从左向右,result = result*2 + bit | 更高效,无浮点运算,推荐使用 | **时间复杂度**:O(n),n 为二进制字符串长度 **空间复杂度**:O(1) --- ### ⚠️ 注意事项 1. **输入长度限制**:`int` 最大支持约 31 位二进制(2³¹-1),更长的输入需使用 `long long` 或 `__int128` 2. **输入格式**:若题目要求连续输入多组数据,可使用 `while(cin >> input)` 循环 3. **非法输入处理**:建议添加校验,避免 `'2'`、`'A'` 等字符导致计算错误 4. **负数处理**:本程序仅处理正二进制数,若需处理负数需额外约定编码方式(如补码) --- ### 🧩 扩展思考 - **反向转换**:十进制 → 二进制可使用 `while(n) { bit = n%2; n/=2; }` - **位运算优化**:`(c - '0')` 等价于 `(c == '1')`,但前者更通用 - **C++17 特性**:可使用 `std::stoi`(但需指定基数,不推荐用于教学) --- ### 📚 开发建议 ✅ 对于竞赛或工程场景,推荐**累乘版本**,避免浮点误差 ✅ 如果输入可能超出 `int` 范围,改用 `long long` 或字符串大数处理 ✅ 可增加对空输入、前导零等边界情况的测试 --- ######[AI写代码神器 | 1018点数解答 | 2026-08-14 21:20:57]

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