Java,Long.parse二进制字符串

时间:2013-02-17 22:38:38

标签: java long-integer

为什么此代码会抛出NumberFormatException

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

7 个答案:

答案 0 :(得分:7)

1000000000000000000000000000000000000000000000000000000000000000大于Long.MAX_VALUE

请参阅https://stackoverflow.com/a/8888969/597657

<击>

请考虑使用BigInteger(String val, int radix)


修改

好的,这对我来说很新。 Integer.parseInt(binaryIntegerString, 2)Long.parseLong(binaryLongString, 2)似乎将二进制解析为符号幅度,而不是二进制补码。

答案 1 :(得分:5)

因为它超出了范围。 1000...000是2 63 ,但Long仅上升到2 63 - 1。

答案 2 :(得分:3)

所有LongIntegerShortByte都是如此。我将用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说:

  

将字符串参数解析为指定基数中的有符号长整数   第二个论点。字符串中的字符必须都是数字   指定的基数(由Character.digit(char, int)是否返回非负值确定),但第一个字符可能   是一个ASCII减号'-' ('\u002D')来表示负值或   ASCII加号'+' ('\u002B')表示正值。该   返回得到的长值。

为了获得MAX_VALUE我们需要:

String max  =  "1111111"; // 7 binary digits, +127 
// or
String max2 = "+1111111"; // 7 binary digits, +127 

答案 3 :(得分:2)

最大的长值实际上是:

0111111111111111111111111111111111111111111111111111111111111111b = 9223372036854775807

答案 4 :(得分:1)

这是因为Long.parseLong无法解析二进制补码表示。在Java SE中解析二进制补码二进制字符串表示的唯一方法是BigInteger:

long l = new BigInteger("1000000000000000000000000000000000000000000000000000000000000000", 2).longValue()

这给了预期-9223372036854775808结果

答案 5 :(得分: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;

答案 6 :(得分:-1)

实际上,这对我有用:

String bitStr = "-1000000000000000000000000000000000000000000000000000000000000000";
System.out.println(Long.parseLong(bitStr, 2));

这里有一点:在 Long.parseLong() 代码逻辑首先寻找显式符号。并且分别对符号使用不同的限制(Long.MAX_VALUE 用于正,Long.MIN_VALUE 用于负二进制文字)。如果此逻辑首先查找最高位(0 表示正数,1 表示负数),可能会更好