Java, Long.parse binary String

后端 未结 6 1994
灰色年华
灰色年华 2020-12-17 20:04

Why does this code throw a NumberFormatException :

String binStr = \"1000000000000000000000000000000000000000000000000000000000000000\";
System         


        
相关标签:
6条回答
  • 2020-12-17 20:09

    Because it's out of range. 1000...000 is 263, but Long only goes up to 263 - 1.

    0 讨论(0)
  • 2020-12-17 20:11

    This is the same for all of Long, Integer, Short and Byte. I'll explain with a Byte example because it's readable:

    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
    

    The digits are interpreted unsigned, no matter what radix is provided. If you want a negative value, you have to have the minus sign at the beginning of the String. JavaDoc says:

    Parses the string argument as a signed long in the radix specified by the second argument. The characters in the string must all be digits of the specified radix (as determined by whether Character.digit(char, int) returns a nonnegative value), except that the first character may be an ASCII minus sign '-' ('\u002D') to indicate a negative value or an ASCII plus sign '+' ('\u002B') to indicate a positive value. The resulting long value is returned.

    In order to get MAX_VALUE we need:

    String max  =  "1111111"; // 7 binary digits, +127 
    // or
    String max2 = "+1111111"; // 7 binary digits, +127 
    
    0 讨论(0)
  • 2020-12-17 20:30

    This is the largest possible long (9223372036854775807 = 2 exp 63 - 1) in binary format. Note the L at the end of the last digit.

     long largestLong = 0B0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L;
    
    0 讨论(0)
  • 2020-12-17 20:33

    1000000000000000000000000000000000000000000000000000000000000000 is larger than Long.MAX_VALUE.

    See https://stackoverflow.com/a/8888969/597657

    Consider using BigInteger(String val, int radix) instead.


    EDIT:

    OK, this is new for me. It appears that Integer.parseInt(binaryIntegerString, 2) and Long.parseLong(binaryLongString, 2) parse binary as sign-magnitude not as a 2's-complement.

    0 讨论(0)
  • 2020-12-17 20:35

    Largest long value is actually:

    0111111111111111111111111111111111111111111111111111111111111111b = 9223372036854775807
    
    0 讨论(0)
  • 2020-12-17 20:35

    This is because Long.parseLong cannot parse two's complement representation. The only way to parse two's complement binary string representation in Java SE is BigInteger:

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

    this gives expected -9223372036854775808result

    0 讨论(0)
提交回复
热议问题