请不要建议使用任何宝石或为无符号整数创建类。
输入数据 - 表示4字节序列的字符串。 输出数据应该是相同类型的字符串。
这是我到目前为止所得到的:
def addition(augend, addend)
sum = augend.to_i(16)+addend.to_i(16)
sum -= 2**32 if sum >= 2**32
sum = "%08X" % sum
return(sum)
end
def subtraction(minuend, subtrahend)
difference = 0
# Some magic here.
difference = "%08X" % difference
return(difference)
end
puts addition('FFFFFFFF', '00000002') # 00000001
puts addition('B1B0AFBA', 'FEEE302D') # B09EDFE7
puts subtraction('00000055', '00000005') # 00000000, expected 00000050
puts subtraction('B1B0AFBA', 'FEEE302D') # 00000000, expected B2C27F8D
subtraction()
应如何实施?可以addition()
进行改进吗?
答案 0 :(得分:0)
基本上只是添加相反。同样在ruby中返回最后一行方法,不需要在最后一行重新分配变量,因为它将返回eval。
def subtraction(minuend, subtrahend)
difference = minuend.to_i(16) - subtrahend.to_i(16)
difference += 2**32 if difference < 0
"%08X" % difference
end
表现似乎很好:
puts Benchmark.measure{ 1000.times {subtraction('B1B0AFBA', 'FEEE302D')} }
#=> 0.010000 0.000000 0.010000 ( 0.001853)
由于这些方法只有不同的3个字符,我想,“为什么不尝试一些元编程来干掉它?”:
subber = lambda {|str, a, b, c| str.gsub('A', a).gsub('B', b).gsub('C', c)}
meth_def = <<EOF
n = arg1.to_i(16) A arg2.to_i(16)
n B= 2**32 if n C= 2**32
"%08X" % n
EOF
define_method(:addition){|arg1, arg2| eval subber.call(meth_def, '+','-', '>')}
define_method(:subtraction){|arg1, arg2| eval subber.call(meth_def, '-','+', '<')}
这可能会被更多干扰,但你明白了。