我在课堂上讨论这个方法:
def OpCodes
if @asm[0] == "ADD"
opcode = "111"
elsif @asm[0] == "CMP"
opcode = "110"
elsif @asm[0] == "SHL"
opcode = "101"
elsif @asm[1] == "SHR"
opcode = "100"
elsif @asm[1] == "NOT"
opcode = "011"
elsif @asm[1] == "XOR"
opcode = "010"
elsif @asm[1] == "OR"
opcode = "001"
elsif @asm[1] == "AND"
opcode = "000"
else
opcode = "ERROR"
end
@opcode = opcode
return @opcode
end
当我运行代码时,例如我给它“添加1,3”字符串,它工作并返回“111”。但是,当我使用其他命令时,它会返回“ERROR”
答案 0 :(得分:2)
您可以重写此内容以使用简单的查找表:
OPCODES = {
ADD: 0b111,
CMP: 0b110,
SHL: 0b101,
SHR: 0b100,
NOT: 0b011,
XOR: 0b010,
OR: 0b001,
AND: 0b000
}.freeze
OPCODE_ERROR = "ERROR".freeze
def opcode(instruction)
OPCODES[instruction.to_sym] or OPCODE_ERROR
end
请注意,使用本机二进制数比使用相同的字符串表示要好得多,所以我在这里使用0bNNN
表示法。 0b001
为1,0b010
为2.如果您希望将n.to_s(2)
用于base-2,则可以转换回字符串。
此外,您永远不应该命名方法CamelCase
样式,这些样式是为类和模块名称保留的。而是使用underscore_style
。
您好像没有正确解析输入。尝试使用正则表达式:
instruction, a, b = input.scan(/\A(\S+)\s+(\S+),\s*(\S+)/)[0]
对于类似"ADD 1,2"
的内容,您可以将这些值分解为可以使用的三个变量。