SorenLantz
SorenLantz

Reputation: 177

BigInteger.intValue()>1 giving incorrect boolean

I am trying to convert a BigInteger number into binary. I use a while loop to reduce the BigInteger until it is equal to 1, taking the remainder as the loop runs.

The conditional for the loop is: (decimalNum.intValue()>1).

But the program only goes through the loop once and then thinks that the BigInteger is less/equal to 1 while in reality it is around 55193474935748. Why is this happening?

("inBinary" is an ArrayList to hold the remainders from the loop.)

Here is the while loop:

while (decimalNum.intValue()>1){
      inBinary.add(0, decimalNum.mod(new BigInteger("2")).intValue()); //Get remainder (0 or 1)
      decimalNum = decimalNum.divide(new BigInteger("2")); //Reduce decimalNum
}

Upvotes: 0

Views: 2083

Answers (2)

JB Nizet
JB Nizet

Reputation: 692023

55,193,474,935,748 doesn't fit into an int: the largest int value is 231 - 1, i.e. 2,147,483,647, which is much smaller. So you get an integer overflow.

This is explained in the javadoc, BTW:

Converts this BigInteger to an int. This conversion is analogous to a narrowing primitive conversion from long to int as defined in section 5.1.3 of The Java™ Language Specification: if this BigInteger is too big to fit in an int, only the low-order 32 bits are returned. Note that this conversion can lose information about the overall magnitude of the BigInteger value as well as return a result with the opposite sign.

If you want to compare a BigInteger to 1, then use

decimalNum.compareTo(BigInteger.ONE) > 0

Upvotes: 8

Gaël J
Gaël J

Reputation: 15250

To get the binary string value of your BigInteger, you could just do

bigInteger.toString(2);

EDIT : As mentionned in the comments by @VinceEmigh, converting BigInteger to int might lead to overflow.

Upvotes: 1

Related Questions