有没有一种方法可以使用marie汇编语言来确定一个数字是偶数还是奇数



通常情况下,您只需要使用模数来确定这一点,但由于这不是一个选项,我尝试使用重复减法循环,并使用skipcond400来确定值是否等于0。如果每次我输入一个数字都是偶数,那就太好了。我遇到的问题是,如果这个数字是奇数,那么这个条件永远不会满足,从而导致无限循环。我可以使用skipcond000作为替代,但它无法告诉我一个数字是否为偶数,因为奇数永远不会等于0,因为它们不能完全成对。我一直纠结于如何确定这一点,因为我的最终目标是用它把所有的偶数加起来,得到一个特定的值。不过,为了做到这一点,我首先需要确定用户输入是偶数还是奇数,这样我就可以有一套不同的指令要做。到目前为止,我脑子里有这样的想法,但我确实不知道该怎么办。我是不是完全错了?

ORG 100
Input
Store y //store input in a variable thats not messed with
Load y
Store x //store a duplicate of the input so i can mess with it 

loop, Load x  // loop that does repeated subtraction  
Subt two
Store x
Skipcond 400
Skipcond 000
Jump loop

x, DEC 0
counter, DEC 0
two, DEC 2

原始代码使用有效的方法来解决任务。下面的伪代码旨在展示如何在MARIE中使用有限的跳过分支。使用标签名称注释可以帮助说明对各种语句的期望。

load X into accumulator
detect_even:
substract 2 from accumulator
skip if accumulator is positive
goto zero_or_neg
# 'accumulator is positive'
goto detect_even
zero_or_neg:
# accumulator is -1 or 0
skip if accumulator is zero
goto not_even
# 'accumulator is zero'
# no op, goto even, or omitted instruction
even:
# here X is even as accumulator is 0
# use X, perhaps add to running total?
not_even:

注意,累加器被重新用于主检测环路,就像X - Y - Y - Y - ..一样。带有负数的YMMV。

MARIE上没有AND指令,在其他机器上,它可以用来轻松隔离最低位。

你可以使用几种技巧。组合Skipcond是非常令人困惑的,但可以使其工作。然而,您应该意识到,Skipcond实际上无法满足我们希望的所有条件,因此,我们最终会采用您建议的巧妙序列。

当当前值为零时,您的序列将继续,我认为这是一个错误。

我相信,只有当值>0。请参阅此答案(末尾的表(,以确定其序列:https://stackoverflow.com/a/66725608/471129.

您还应该能够在一个序列中使用多个Skipcond,但为了重复,超级混乱应该是可行的。


另一种选择是移动感兴趣的位。每次将一个数字加倍(可以通过将其自身相加来完成(,都会执行左移。其中15个将把LSB(它告诉我们数字是否为偶数/奇数(移动到MSB位置,这可以使用Skipcond进行测试。

最新更新