2011-09-09 6 views
5

Actualmente estoy convirtiendo un algoritmo de Java a Ruby, y me he topado un poco con la falta de desbordamiento de enteros en Ruby.¿Cómo emulo el desbordamiento de enteros en una variable de Fixnum?

Digamos que tiene un valor de 2663860877, esto es más grande que el entero máximo 2147483648.

En Java, que se envuelve alrededor y que debe recibir -1631106419.

me encontré con este fragmento de código, pero no parece estar funcionando:

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

And'ing la variable no fuerce negativa como cabría esperar.

+1

Es posible que desee considerar volver a implementar el algoritmo como un todo en lugar de tratar de transcribir Java para Ruby. Los números en Ruby son números, no son un contenedor conveniente para una secuencia de bits. –

Respuesta

6

Suponiendo enteros de 32 bits con complemento de dos negativos que esto debería funcionar:

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 
Cuestiones relacionadas