将n位二进制转为10进制数
Convert n-bit binary to base 10 number
我正在看这个小人电脑问题:
- 第一个输入确定 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 上做乘法。
您的代码没有使用第一个输入。相反,它使用 FOUR
。这是要更改的第一件事,因为您不想恰好循环四次,而是与第一次输入的次数一样多。
其次,您不需要将每个下一个输入都存储在单独的邮箱中。相反,您可以立即处理 0/1 输入,因为它决定您是否要向结果添加某些内容。所以你只需要根据输入的 0/1 值更新结果。您不需要存储 0/1 值本身——因此不需要 A
、B
、C
...等。而是将 IN
指令 放在 循环中。
然后仍然是 what 当输入结果为 1 时,您应该添加到结果中。由于输入的顺序相反(最低有效位在前),您应该跟踪 2 的幂,在循环的每次迭代中将其加倍。每当您遇到输入 1 时,这就是要添加到结果中的数字。因为这就是二进制系统的工作方式。比如输入的数字是1 1 0 1,那么计算就是:
input digit
power of 2
to be added
running sum
1
1
yes
1
1
2
yes
3
0
4
no
3
1
8
yes
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>
我正在看这个小人电脑问题:
- 第一个输入确定 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 上做乘法。
您的代码没有使用第一个输入。相反,它使用 FOUR
。这是要更改的第一件事,因为您不想恰好循环四次,而是与第一次输入的次数一样多。
其次,您不需要将每个下一个输入都存储在单独的邮箱中。相反,您可以立即处理 0/1 输入,因为它决定您是否要向结果添加某些内容。所以你只需要根据输入的 0/1 值更新结果。您不需要存储 0/1 值本身——因此不需要 A
、B
、C
...等。而是将 IN
指令 放在 循环中。
然后仍然是 what 当输入结果为 1 时,您应该添加到结果中。由于输入的顺序相反(最低有效位在前),您应该跟踪 2 的幂,在循环的每次迭代中将其加倍。每当您遇到输入 1 时,这就是要添加到结果中的数字。因为这就是二进制系统的工作方式。比如输入的数字是1 1 0 1,那么计算就是:
input digit | power of 2 | to be added | running sum |
---|---|---|---|
1 | 1 | yes | 1 |
1 | 2 | yes | 3 |
0 | 4 | no | 3 |
1 | 8 | yes | 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>