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);