您拥有的代码不使用第一个输入。相反,它使用FOUR
. 这是要改变的第一件事,因为您不想循环精确四次,而是与您的第一个输入一样多。
其次,您不需要将每个下一个输入存储在单独的邮箱中。相反,您可以立即处理 0/1 输入,因为它决定是否要向结果中添加某些内容。因此,您只需要根据输入的 0/1 值更新结果。您不需要存储该 0/1 值本身 - 所以不需要A
, B
, C
... 等。而是将IN
指令放在循环中。
然后仍然是当输入结果为 1 时您应该添加到结果中的确切内容。由于输入顺序相反(最低有效位在前),您应该跟踪 2 的幂,在每个幂中加倍循环的迭代。每当您遇到输入 1 时,这将是添加到结果中的数字。因为这就是二进制系统的工作方式。例如,如果输入的数字是 1 1 0 1,那么计算是:
输入数字 |
2的幂 |
待添加 |
运行总和 |
1 |
1 |
是的 |
1 |
1 |
2 |
是的 |
3 |
0 |
4 |
不 |
3 |
1 |
8 |
是的 |
11 |
所以这里是脚本。您可以在此处运行它:首先运行代码片段(启动 LMC 模拟器),然后使用右侧面板中的控件:
#input:8 1 0 1 1 0 0 0 0
LDA ZERO # Initialise, so program still runs
STO RESULT # correctly when it is reset.
LDA ONE
STO POWER
IN # Get number of binary digits
LOOP BRZ OUTPUT # All digits have been read
STO COUNT
IN # Get a binary digit
BRZ NEXT # Nothing to add when it's zero
LDA RESULT # Add a power of 2 to the result
ADD POWER
STO RESULT
NEXT LDA POWER # Next power of 2
ADD POWER
STO POWER
LDA COUNT # Prepare for next iteration
SUB ONE
BR LOOP
OUTPUT LDA RESULT
OUT
ZERO HLT
ONE DAT 1
POWER DAT 1
COUNT DAT
RESULT DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>