Java - 将二进制解析为long

and*_*dev 7 java string binary java-8

我有一个数字的二进制表示,并希望将其转换为long(我有Java 8)

public class TestLongs {
public static void main(String[] args){
    String a = Long.toBinaryString(Long.parseLong("-1")); // 1111111111111111111111111111111111111111111111111111111111111111
    System.out.println(a);
    System.out.println(Long.parseLong(a, 2));// ??? but Long.parseUnsignedLong(a, 2) works
}
Run Code Online (Sandbox Code Playgroud)

}

这段代码导致Exception in thread "main" java.lang.NumberFormatException: For input string: "1111111111111111111111111111111111111111111111111111111111111111" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 1111111111111111111111111111111111111111111111111111111111111111 at java.lang.Long.parseLong(Long.java:592) 这里有什么问题?为什么Long.parseLong(a,2)不起作用?

Era*_*ran 5

Long.parseLong()不会将第一个'1'字符视为符号位,因此该数字被解析为2 ^ 64-1,这太大了long.Long.parseLong()期望String表示负数的输入s以' - '开头.

为了Long.parseLong(str,2)要回-1,你应该传递给它一个String与" - "开始,并用二进制表示结束1-即Long.parseLong("-1",2).

  • @android_dev`long`仍然是签名的,所以当你打印`Long.parseUnsignedLong("11111111111111111 11111111111111111111 11111111111111111111 1111111",2))`你看到-1.要将此数字视为无符号长整数,需要使用静态方法`Long.toUnsignedString()`进行打印. (2认同)