1. 二进制字符串转十进制:从基础到优化的完整实现
二进制字符串转十进制是C++初学者必须掌握的经典算法之一。这个看似简单的任务,实际上涵盖了字符串处理、位运算、算法优化等多个核心编程概念。我在教学和实际开发中发现,很多初学者虽然能写出基础版本,但对性能优化和边界条件的处理往往不够重视。
让我们从一个最直观的实现开始,逐步深入到更高效的版本。在这个过程中,你会理解为什么某些写法更优,以及如何避免常见的陷阱。这个练习不仅能提升你的C++基本功,还能培养算法思维——这在技术面试和实际项目中都非常重要。
2. 基础版实现:理解核心算法
2.1 算法原理与实现
最基本的思路是遍历二进制字符串的每一位,根据其位置计算对应的权值(2的幂次),然后累加得到十进制结果。这个方法的数学基础是:
code复制decimal = Σ (bit_i × 2^(n-1-i)) (i从0到n-1)
其中n是字符串长度,bit_i是第i位的字符('0'或'1')。
cpp复制#include <string>
#include <cmath>
int binaryToDecimalBasic(const std::string& binaryStr) {
int decimal = 0;
int length = binaryStr.length();
for (int i = 0; i < length; ++i) {
if (binaryStr[i] == '1') {
decimal += pow(2, length - 1 - i);
}
// '0'的情况不需要处理
}
return decimal;
}
注意:这里使用了
pow函数计算2的幂次,虽然代码简洁,但效率不高。我们会在优化版中改进这一点。
2.2 边界条件与输入验证
一个健壮的实现必须处理各种异常输入:
cpp复制int binaryToDecimalSafe(const std::string& binaryStr) {
// 空字符串检查
if (binaryStr.empty()) {
throw std::invalid_argument("Input string cannot be empty");
}
int decimal = 0;
int length = binaryStr.length();
for (int i = 0; i < length; ++i) {
char c = binaryStr[i];
// 非法字符检查
