1

我在看这个小人电脑问题:

  • 第一个输入确定 n 的值,假设该值等于 4 或更大
  • 示例:如果第一个输入是八 (8),则请求八个后续输入。如果随后的输入编号为 1、0、0、1、0、0、0、0,则输出将为 9。
  • n 个输入值由用户提供,每个位一个:第一个是最低有效位。第 n 个输入是最高有效位。

我的尝试:

IN
STO NUMBER
IN
STO A
IN
STO B
IN
STO C
IN
STO D


LOOPB: LDA FOUR
BRZ ENDB
SUB ONE
STO FOUR
LDA RESB
ADD B
STO RESB
BRP LOOP
ENDB:LDA RESB
OUT
HLT

ONE: DAT 1
EIGHT: DAT 8
FOUR: DAT 4
TWO: DAT 2
POWERONE: DAT 1

RESA: DAT 000
RESB: DAT 000

RESULT: DAT 000

NUMBER: DAT 0
A: DAT 0
B: DAT 0
C: DAT 0
D: DAT 0

我不知道如何解决这个问题,如何使 00001001 在 LMC 上转换为 9?我不确定如何在 LMC 上进行乘法运算。

4

1 回答 1

0

您拥有的代码不使用第一个输入。相反,它使用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>

于 2021-04-08T05:58:08.037 回答