的Java,Long.parse二进制字符串
为什么这个代码抛出NumberFormatException
:的Java,Long.parse二进制字符串
String binStr = "1000000000000000000000000000000000000000000000000000000000000000";
System.out.println(binStr.length());// = 64
System.out.println(Long.parseLong(binStr, 2));
1000000000000000000000000000000000000000000000000000000000000000
比
Long.MAX_VALUE
大。
见https://*.com/a/8888969/597657
考虑使用BigInteger(String val, int radix)
代替。
编辑:
OK,这是新的我。看起来Integer.parseInt(binaryIntegerString, 2)
和Long.parseLong(binaryLongString, 2)
解析二进制为符号量级而不是二进制补码。
你错过了我第一次评论时错过的内容;)它不是*更大* ......它不存在。 – 2013-02-17 22:55:04
'String binStr =“1000000000000000000000000000000000000000000000000000000000000000”; 的System.out.println(binStr.length()); // = 64 的System.out.println(的Long.parseLong(binStr,2));' – 2013-02-17 22:58:56
即链接答案是错误的,爪哇表示整数作为二进制补码内部,而不是数量级。 – 2013-02-17 23:38:55
因为它超出范围。 1000...000
是2 ,但Long
只上升到2 - 1
你错过了什么,我错过了,当我第一次评论;)这不是* *更大,它不存在。 – 2013-02-17 22:53:29
所以,毕竟我们的讨论中,*应*是'来自位图形Long.MIN_VALUE',但'parseLong'不喜欢这一点。每天学些新东西 :) – 2013-02-18 00:13:10
最大的长期价值居然是:
0111111111111111111111111111111111111111111111111111111111111111b = 9223372036854775807
这是对所有的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说:
将字符串参数解析为以 第二个参数指定的基数long 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
这是因为的Long.parseLong无法解析二进制补码表示。解析在Java SE二进制补码字符串表示的唯一方法是BigInteger的:
long l = new BigInteger("1000000000000000000000000000000000000000000000000000000000000000", 2).longValue()
这给预期-9223372036854775808result
这是最大的可能长(9223372036854775807 = 2 EXP 63 - 1)以二进制格式。注意最后一位数字末尾的L.
long largestLong = 0B0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L;
重读这一点,它实际上是一个很好的问题。 – 2013-02-17 22:52:37
+1好问题。 – 2013-02-17 23:55:48
这可能是一个有趣的* *的问题,但肯定不是一个[*良好*问题(http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist)。 – Jeroen 2013-02-18 00:12:51