Home > front end >  Unable to parse very long binary string to numeric type
Unable to parse very long binary string to numeric type

Time:06-05

Folks, I am trying to parse an extremely long binary String to its decimal equivalent, but its throwing the NumberFormatException.

String s = "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"  
        "1111111111111111"; //String length is 1969

long n = Long.parseLong(s, 2); //line no. 25

System.out.println(n);

But it's giving the below-mentioned Runtime error:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1111[...]111" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Long.parseLong(Long.java:592) at Check2.main(Check2.java:25)

Tried using BigInteger,valueOf() methods too, but all efforts are going in vain.

Please do let me know if there's any other way to achieve the desired result.

Update:

    BigInteger n = new BigInteger(s, 2);
        int count = 0;  while (n.intValue() != 0) {
            if (n.intValue() % 2 == 0) {
                n = BigInteger.valueOf(n.intValue() / 2);
                count  ;    } else {
                n = BigInteger.valueOf(n.intValue() - 1);
                count  ;
            }

        }
        System.out.println(count);

Taking forever to execute

CodePudding user response:

The java long data type has a minimum value of -9,223,372,036,854,775,808 and a maximum value of 9,223,372,036,854,775,807. The number you have is much greater than the maximum limit allowed.

You can use BigInteger for your String instead.

BigInteger result = new BigInteger(inputString, 2);

CodePudding user response:

Both int and long have a maximum (and miminum) value, see the documentation for int and long accordingly. The decimal representation of your binary string exceeds these limits.

You might use a BigDecimal instead to parse the String. It provides a constructor accepting a String with the number and the radix to use. As your string is in binary format, you should pass the radix value of 2.

BigInteger myValue = new BigInteger(s, 2);
  • Related