9

このコードがスローする理由NumberFormatException:

String binStr = "1000000000000000000000000000000000000000000000000000000000000000";
System.out.println(binStr.length());// =  64
System.out.println(Long.parseLong(binStr, 2));
4

7 に答える 7

7

1000000000000000000000000000000000000000000000000000000000000000より大きいですLong.MAX_VALUE

https://stackoverflow.com/a/8888969/597657を参照してください

BigInteger(String val, int radix)代わりに使用することを検討してください。


編集:

わかりました、これは私にとって新しいことです。バイナリを 2 の補数としてではなく符号の大きさとして解析するようInteger.parseInt(binaryIntegerString, 2)です。Long.parseLong(binaryLongString, 2)

于 2013-02-17T22:40:23.137 に答える
5

圏外だから。 1000...000は 2 63ですが、 2 63 - 1Longまでしか上がりません。

于 2013-02-17T22:40:23.177 に答える
4

これは、LongIntegerShortおよびのすべてで同じですByteByte読みやすいので、例を挙げて説明します。

System.out.println(Byte.MIN_VALUE); // -128
System.out.println(Byte.MAX_VALUE); // 127
String positive =  "1000000"; // 8 binary digits, +128 
String negative = "-1000000"; // 8 binary digits, -128
String plus     = "+1000000"; // 8 binary digits, +128
Byte.parseByte(positive, 2); //will fail because it's bigger than Byte.MAX_VALUE 
Byte.parseByte(negative, 2); //won't fail. It will return Byte.MIN_VALUE
Byte.parseByte(plus, 2);     //will fail because its bigger than Byte.MAX_VALUE

指定された基数に関係なく、数字は符号なしで解釈されます。負の値が必要な場合は、文字列の先頭にマイナス記号を付ける必要があります。JavaDocは次のように述べています。

文字列引数を、2 番目の引数で指定された基数の符号付き long として解析します。文字列内の文字はすべて、指定された基数 ( がCharacter.digit(char, int)非負の値を返すかどうかによって決定される) の数字である必要があります。ただし、最初の文字は、負の値を示す ASCII マイナス記号または正の値を示す'-' ('\u002D')ASCII プラス記号である場合があります。 '+' ('\u002B'). 結果の long 値が返されます。

取得するには、次のものがMAX_VALUE必要です。

String max  =  "1111111"; // 7 binary digits, +127 
// or
String max2 = "+1111111"; // 7 binary digits, +127 
于 2013-02-17T23:49:15.167 に答える
0

これは、可能な最大長 (9223372036854775807 = 2 exp 63 - 1) のバイナリ形式です。最後の桁の末尾にある L に注意してください。

 long largestLong = 0B0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L;
于 2017-01-05T23:36:05.117 に答える