2011-09-09 19 views
5

Şu anda Java'dan Ruby'ye bir algoritma dönüştürüyorum ve Ruby'de taşan tamsayı yokluğundan biraz şaşırdım. Fixnum değişkeninde tamsayı taşması nasıl taklit edebilirim?

bu, etrafında sarar ve ben -1631106419 almalısınız Java'da maksimum tamsayı 2147483648.

daha büyük, ben 2663860877 değeri olduğunu varsayalım.

Ben bu kod biraz buldum, ama çalışıyor gibi görünmüyor:

def force_overflow(i) 
    if i < -2147483648 
    -(-(i) & 0xffffffff) 
    elsif i > 2147483647 
    i & 0xffffffff 
    else 
    i 
    end 
end 

değişken negatif beklediğiniz gibi zorlamaz And'ing. ikinin tamamlayıcısı negatifleri ile

+1

yerine Ruby Java transliterasyon çalışırken bir bütün olarak algoritma yeniden hayata düşünebilirsiniz. Ruby'deki sayılar sayılardır, bir bit dizisi için uygun bir kap değildir. –

cevap

6

varsayarsak 32bit tamsayılar bu çalışması gerekir:

def force_overflow_signed(i) 
    force_overflow_unsigned(i + 2**31) - 2**31 
end 

def force_overflow_unsigned(i) 
    i % 2**32 # or equivalently: i & 0xffffffff 
end 
İlgili konular