2011-09-09 15 views
5

Obecnie konwertuję algorytm z Java na Ruby, i trafiłem trochę na szkopuł z brakiem całkowitej przepełnienia Ruby.Jak emulować przepełnienie liczby całkowitej w zmiennej Fixnum?

Say I mieć wartość 2663860877, jest większa niż max całkowitą 2147483648.

w Javie, owija się wokół i powinienem dostać -1631106419.

znalazłem ten kawałek kodu, ale nie wydaje się działać:

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

And'ing zmienna nie wymusza ona negatywna jak można się spodziewać.

+1

Można rozważyć ponowne wdrożenie algorytmu jako całość, zamiast próbować transliterować Java do Ruby. Liczby w Ruby są liczbami, nie są wygodnym kontenerem dla sekwencji bitów. –

Odpowiedz

6

Zakładając całkowitymi 32bit z dwoma za negatywów dopełniacza to powinno działać:

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 
Powiązane problemy