2011-09-09 6 views
5

私は現在、アルゴリズムをJavaからRubyに変換しています。私は、Rubyで整数オーバーフローの欠点を少し突きました。Fixnum変数で整数オーバーフローをエミュレートするにはどうすればよいですか?

が、これはJavaでは2147483648

最大整数よりも大きいです、私は2663860877の価値があると、それが周りにラップし、私は-1631106419を取得する必要があります。

私はこのコードのビットを見つけたが、それが動作していないようです:あなたが期待するよう

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

変数をAnd'ingすることは、負のそれを強制しません。

+1

あなたが代わりにルビーへのJavaを翻字しようとしているの全体として再実装するアルゴリズムを検討する必要があります。 Rubyの数字は数字ですが、一連のビットの便利なコンテナではありません。 –

答えて

6

これは動作するはずの2の補数ネガと32ビットの整数と仮定すると:

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 
関連する問題