このコードがスローする理由NumberFormatException
:
String binStr = "1000000000000000000000000000000000000000000000000000000000000000";
System.out.println(binStr.length());// = 64
System.out.println(Long.parseLong(binStr, 2));
このコードがスローする理由NumberFormatException
:
String binStr = "1000000000000000000000000000000000000000000000000000000000000000";
System.out.println(binStr.length());// = 64
System.out.println(Long.parseLong(binStr, 2));
1000000000000000000000000000000000000000000000000000000000000000
より大きいですLong.MAX_VALUE
。
https://stackoverflow.com/a/8888969/597657を参照してください
BigInteger(String val, int radix)
代わりに使用することを検討してください。
編集:
わかりました、これは私にとって新しいことです。バイナリを 2 の補数としてではなく符号の大きさとして解析するようInteger.parseInt(binaryIntegerString, 2)
です。Long.parseLong(binaryLongString, 2)
圏外だから。 1000...000
は 2 63ですが、 2 63 - 1Long
までしか上がりません。
これは、Long
、Integer
、Short
およびのすべてで同じですByte
。Byte
読みやすいので、例を挙げて説明します。
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
これは、可能な最大長 (9223372036854775807 = 2 exp 63 - 1) のバイナリ形式です。最後の桁の末尾にある L に注意してください。
long largestLong = 0B0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L;