2012-03-18 11 views
2

私はBigIntegerをランダムな値で試しています。BigInteger.toByteArray()Javaで異常な値を返す

BigInteger bi1 = new BigInteger("365375409332725729550921208179070754913983135742"); 
BigInteger bi2 = new BigInteger("386718480727050819604290866521372728863001258687"); 

byte[] bytesBi1 = bi1.toByteArray(); 
byte[] bytesBi2 = bi2.toByteArray(); 

最初のものは奇妙な値を生成するものです。 もう1つはOKです。

誰かが私に間違っていることを説明することはできますか?

編集

Here're結果:

bytesBi1 = [63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2] 
bytesBi2 = [67, -67, 14, 113, -94, 16, -120, 82, 84, 95, -127, -124, -90, -33, 29, -102, 90, 125, -86, -65] 
+7

「奇妙な価値」とはどういう意味ですか?おそらく、いくつかのコードを示すかもしれないことを詳しく教えてください。乾杯! – SimonSez

+2

配列に負の数を与えることを意味しますか?その場合は、Javaのバイトが符号付きバイトであるためです。 –

+0

投稿を編集して結果を追加しました。私はbytesBi1がこの値を持つ理由を理解していません。 –

答えて

1

BigIntegertoByteArray()メソッドは、数字のtwo's complementを返します。あなたが取得している

値は、実際にあなたが入れた数字の正しい2の補数表現されている。

-1

私は任意精度数の私の独自の実装を与えられた数をテストしました。 バイト値は完全に正しいので、乱数ジェネレータが乱れた場合、品質が悪い場合、または異常な外れ値がある場合があります。

0

これはbi1の六角内部表現では、デバッガ

mag[0] = 3FFFFFFF 
mag[1] = FFFFFFFF 
mag[2] = FFFFFFFF 
mag[3] = FFFFFFFF 
mag[4] = 00000001 
でそれを見ることができます

各dwordを4バイトで分割し、各バイトののの2の補数を取ると、
が得られます。最初の行のための

例えば:mag[0] = 3F,FF,FF,FFウィッヒ10進数で63, -1 ,-1,-1にあなたの出力と間違っ

だから、何も変わりません。

関連する問題