我用霍纳法则编写的二进制转十进制函数出错,问题出在哪里?
问题原因
你的代码核心逻辑错误是二进制字符串的遍历顺序和霍纳法则的要求相反:
- 常规二进制字符串的最左侧为最高位、最右侧为最低位,比如
"1011"对应的数值为1*2³ + 0*2² + 1*2¹ + 1*2⁰ = 11。 - 你的代码从最右侧的最低位开始初始化、向左遍历计算,等价于将原二进制字符串倒序后做转换:
"1011"倒序为"1101",对应数值为13,和你得到的错误结果一致。你测试"1010"得到5,也是倒序后"0101"对应的十进制值,同样可以验证该问题。
修复方案
按照霍纳法则的要求,从字符串首位(最高位)开始遍历即可,优化后代码如下:
int bintodec(string s) { int W = 0; const int x = 2; for(int i = 0; i < s.size(); i++) { W = W * x + (s[i] - '0'); // 用'0'代替硬编码48,可读性更强 } return W; }
效果验证
输入"1011"时计算过程:
初始W=0 → 02+1=1 → 12+0=2 → 22+1=5 →52+1=11,结果符合预期。
输入"1010"时最终计算结果为10,也和正确值一致。
内容的提问来源于stack exchange,提问作者Qbek12321
相关产品推荐
相关产品推荐

