如何在Ruby中实现uint32加法和减法操作?

时间:2018-03-22 21:02:09

标签: ruby hex unsigned unsigned-integer uint32

请不要建议使用任何宝石或为无符号整数创建类。

输入数据 - 表示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()进行改进吗?

1 个答案:

答案 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, '-','+', '<')}

这可能会被更多干扰,但你明白了。