2016-07-28 1 views
0

に失敗:ビット単位のほかには、Java上で動作しますが、私はLeetCode上の質問を読んそして、この1で出くわしたルビー

「二つの整数a、bの合計を計算しますが、あなたが使用を許可されていません演算子+と - "

ウェブ上でよくある質問です。この質問のための

Javaソリューションは、次のとおりです。正常に動作します

public int getSum(int a, int b) { 
    while(b!=0){ 
     int c = a&b; 
     a=a^b; 
     b=c<<1; 
    } 
    return a; 
} 

。しかし、Rubyの同じコード:

def get_sum(a, b) 
    while b != 0 do 
     c = a & b; 
     a = a^b; 
     b = c << 1; 
    end 
    return a; 
end 

は機能しません。実際には、 'a'と 'b'の両方が正数であれば動作しますが、 'a'または 'b'のいずれかが負数であると失敗します。私は問題がキャリアをシフトすることに関連していると思うが、それもJavaで同じではない?皆さんはRubyで何が違うか考えていますか?

ありがとうございます。

+0

が見るので、それは実際には正の数であるようにビット演算の後に負の数を想定して固定サイズを持っていないので、 [この質問](http://stackoverflow.com/questions/15359807/signed-and-unsigned-integers-in-ruby) – samgak

+0

ちょうど参考として:なぜあなたの期待ですか?同じプログラムを2つの言語で書き留めることができるという事実は、各要素とタイプが両方の言語で**同じ意味**を持つことを絶対に意味するものではありません。私は、「すべてがまったく同じです」と言うのは、かなり例外的な状況になると言います。 – GhostCat

答えて

1

Javaでは、Integerはゼロになる前に一定回数シフトされたままにすることができます。この回数は整数値のサイズまたはビット数です(intの場合は32ビットです)。

これは、Javaでループが壊れて、bがゼロになるためです。

しかし、Rubyでは、数値が0になる前に何回シフトされても何回も残ることができます。これは、ルビの数値の固定ビット数がないためです。

だから、bが大きくなります(メモリが足りなくなるまで)。

つまり、正の数でも機能しないで、無限ループに入るはずです。

この無限ループを解消するには、すべての結果を固定精度でANDすることで、数値の精度を制限することができます。

precision = 0xFFFF; 
b = (c << 1) & precision; 

負の数の場合は、もう1つのボトルネックがあります。

FixNumは2の補数で1111であっても-1ルビーが正の値のためにそれを取る15.

関連する問題