无特殊函数将0/1数组转十进制,代码返回2而非1求错误原因
二进制数组转十进制的代码错误分析与修正
你的代码运行结果不符合预期,核心问题出在移位操作和位合并的顺序,以及循环的处理逻辑上:
- 原代码中每次循环先把当前数组的位值合并到
value,再执行左移,这会导致所有位都被多移了一次——包括最后一位处理完后,依然执行了左移操作,直接把结果放大了2倍。 - 你的数组定义里
Array[0]是最低位(对应2⁰),但原循环从i=0到7的处理顺序,结合先合并后移位的逻辑,会让低位被反复移位,最终完全错位。
修正方案1:调整移位与合并的顺序(从高位到低位处理)
这种方式更符合二进制转十进制的逻辑,先处理最高位,逐步左移并合并低位:
Array[7] = 0 Array[6] = 0 Array[5] = 0 Array[4] = 0 Array[3] = 0 Array[2] = 0 Array[1] = 0 Array[0] = 1 value=0 for i=7 to 0 step -1 value = value shl 1 value = value or Array[i] next
修正方案2:直接按位权计算(无需移位)
如果不喜欢移位操作,可以直接利用每一位的位权(2的i次方)累加计算,逻辑更直观:
Array[7] = 0 Array[6] = 0 Array[5] = 0 Array[4] = 0 Array[3] = 0 Array[2] = 0 Array[1] = 0 Array[0] = 1 value=0 for i=0 to 7 value = value + Array[i] * (2 ^ i) next
修正方案3:保留原循环顺序,避免多余移位
如果要维持原有的循环方向,只需要减少一次循环,最后单独处理最高位,避免最后一次不必要的移位:
Array[7] = 0 Array[6] = 0 Array[5] = 0 Array[4] = 0 Array[3] = 0 Array[2] = 0 Array[1] = 0 Array[0] = 1 value=0 for i=0 to 6 value = value or Array[i] value = value shl 1 next value = value or Array[7]
原代码得到结果2的原因:循环执行了8次,第一次循环将value设为1后立即左移变成2,后续循环处理的都是0,每次左移后依然是2,最终输出结果就是2。
内容的提问来源于stack exchange,提问作者Markus.H1
相关产品推荐
相关产品推荐

