C++中如何将二进制字符串转换为十进制整数?
修复二进制字符串转十进制的问题
你的代码存在几个关键问题,逐一修复如下:
1. 修正参数传递方式
当前value是按值传递,函数内的修改不会同步到外部变量。改成引用传递,或者让函数直接返回计算结果:
// 方式1:使用引用传递 void binaryToDec(string binaryString, int& value) // 方式2:返回计算结果 int binaryToDec(string binaryString)
2. 正确转换字符为数字
字符'0'和'1'的ASCII码分别是48和49,直接用int(binaryString[i])得到的是ASCII值,不是0或1。正确的转换是用字符减去'0':
int bit = binaryString[i] - '0';
3. 修正二进制位的权重计算
二进制字符串的最左侧是最高位,比如"101"的第一位'1'对应2^2,而不是2^0。你的循环从左到右遍历,索引i对应的权重应该是2^(长度-1-i)。另外,避免用pow(返回double可能有精度问题),用整数移位运算更可靠:
// 用移位代替pow,2^n等价于1 << n int weight = 1 << (binaryStringLength - 1 - i);
4. 修复累加逻辑
原代码里的value += pow(2,i)+ binaryString[i];逻辑错误,应该是value += bit * weight,而非加法。
完整修复后的代码示例
方式1:引用传递版本
void binaryToDec(string binaryString, int& value) { value = 0; // 先重置为0,避免外部初始值干扰 int binaryStringLength = binaryString.length(); for (int i = 0; i < binaryStringLength; i++) { int bit = binaryString[i] - '0'; int weight = 1 << (binaryStringLength - 1 - i); value += bit * weight; } }
方式2:返回值版本
int binaryToDec(string binaryString) { int value = 0; int binaryStringLength = binaryString.length(); for (int i = 0; i < binaryStringLength; i++) { int bit = binaryString[i] - '0'; int weight = 1 << (binaryStringLength - 1 - i); value += bit * weight; } return value; }
额外优化:从右往左遍历(更高效)
可以从字符串末尾开始遍历,每次将当前值左移1位(等价于乘以2),再加上当前位的数字:
int binaryToDec(string binaryString) { int value = 0; for (char c : binaryString) { value = (value << 1) + (c - '0'); } return value; }
这个版本逻辑更简洁,也避免了计算长度和复杂的权重索引。
内容的提问来源于stack exchange,提问作者Andrew Hoette
相关产品推荐
相关产品推荐

