如何使用 MARIE 查找偶数?
How can I find even numbers using MARIE?
我正在做一个项目,但我被卡住了。我正在尝试编写一段代码,通过将给定数字减去 2(给定数字不能超过 6)来检查给定数字是否为偶数。如果是偶数,则打印 0,如果是奇数,则打印 1。
int count=input.nextInt()
int parity=0
while (count>0)
count=count-2;
if (count<0) {
parity=parity+1;
System.out.print(parity);
}
else if (count==0) {
System.out.println(parity);
}
^^ 这是我的 java 代码,我尝试将其翻译成 MARIE 语言,但没有任何效果。
我会 post 我的 MARIE 代码,但我觉得它太混乱了 :/
只需要检查低位为0/non-zero。普通架构有一个 AND 指令可以使它变得简单,但是 MARIE only has add/sub(并比较更大或 less-than)。
但是,是的,你的循环会工作,对一个数字 n
进行 O(n) 次迭代。如果你把它写成一个 do{}while()
循环,在 asm 中实现会容易得多,比如
n = input;
do {
n-=2; // sub
}while(n>=0); // skipcond
// n==0 or -1 for even or odd
您可以在 O(log(n))
操作中使用 add
作为左移:AC+AC
与 AC << 1
相同。这样做 15 次以将低位移到顶部,并将其他位移出。 (累加器,AC, is 16 bits wide)。
不幸的是,这对 MARIE 来说真的很不方便,因为 ADD only works with a memory source operand,而不是 AC
。所以你必须 store AC 某处,这样你就可以将它用作 ADD 的内存源操作数。
(当您知道您的输入在 0..6[=43= 范围内时,这 绝对不值得。在这种情况下,它最多只需要 [ 的 3 次迭代=19=] 循环得到结果,与此相比总是 15。但是对于不受限制的输入,n-=2
版本可能需要 32768 次迭代!如果我们将其限制为正符号整数,则为 16384;n-=2
版本甚至不适用于负整数)
例如:
/ Assuming input in AC
Store tmp
Add tmp
Store tmp
Add tmp
/ repeat this 13 more times, for a total of 15 ADDs
/ inconvenient to make a loop because Marie only has 1 register
/ but would be smaller for this many shifts
/ AC = input << 15
/ AC is non-zero for odd, zero for even. You could just store that directly if you want.
/ If you want to branch on it here, or in some code that reloads that 0 / non-zero result
SkipCond 400 / jump over next insn if AC==0
jump odd_input / or this can be a store instruction
/ else fall through when input was even: input&1 == 0
tmp, dec 0
一个循环是有意义的,特别是如果你将它展开 2 或其他东西。如果 AC 只有 8 位,完全展开只需要 7 STORE/ADD 条指令,但是 15 条指令有点多。
我正在做一个项目,但我被卡住了。我正在尝试编写一段代码,通过将给定数字减去 2(给定数字不能超过 6)来检查给定数字是否为偶数。如果是偶数,则打印 0,如果是奇数,则打印 1。
int count=input.nextInt()
int parity=0
while (count>0)
count=count-2;
if (count<0) {
parity=parity+1;
System.out.print(parity);
}
else if (count==0) {
System.out.println(parity);
}
^^ 这是我的 java 代码,我尝试将其翻译成 MARIE 语言,但没有任何效果。
我会 post 我的 MARIE 代码,但我觉得它太混乱了 :/
只需要检查低位为0/non-zero。普通架构有一个 AND 指令可以使它变得简单,但是 MARIE only has add/sub(并比较更大或 less-than)。
但是,是的,你的循环会工作,对一个数字 n
进行 O(n) 次迭代。如果你把它写成一个 do{}while()
循环,在 asm 中实现会容易得多,比如
n = input;
do {
n-=2; // sub
}while(n>=0); // skipcond
// n==0 or -1 for even or odd
您可以在 O(log(n))
操作中使用 add
作为左移:AC+AC
与 AC << 1
相同。这样做 15 次以将低位移到顶部,并将其他位移出。 (累加器,AC, is 16 bits wide)。
不幸的是,这对 MARIE 来说真的很不方便,因为 ADD only works with a memory source operand,而不是 AC
。所以你必须 store AC 某处,这样你就可以将它用作 ADD 的内存源操作数。
(当您知道您的输入在 0..6[=43= 范围内时,这 绝对不值得。在这种情况下,它最多只需要 [ 的 3 次迭代=19=] 循环得到结果,与此相比总是 15。但是对于不受限制的输入,n-=2
版本可能需要 32768 次迭代!如果我们将其限制为正符号整数,则为 16384;n-=2
版本甚至不适用于负整数)
例如:
/ Assuming input in AC
Store tmp
Add tmp
Store tmp
Add tmp
/ repeat this 13 more times, for a total of 15 ADDs
/ inconvenient to make a loop because Marie only has 1 register
/ but would be smaller for this many shifts
/ AC = input << 15
/ AC is non-zero for odd, zero for even. You could just store that directly if you want.
/ If you want to branch on it here, or in some code that reloads that 0 / non-zero result
SkipCond 400 / jump over next insn if AC==0
jump odd_input / or this can be a store instruction
/ else fall through when input was even: input&1 == 0
tmp, dec 0
一个循环是有意义的,特别是如果你将它展开 2 或其他东西。如果 AC 只有 8 位,完全展开只需要 7 STORE/ADD 条指令,但是 15 条指令有点多。