BigInteger.intValue()> 1给出错误的布尔值

时间:2015-10-17 16:52:11

标签: java math while-loop conditional biginteger

我正在尝试将BigInteger数字转换为二进制数。我使用while循环来减少BigInteger,直到它等于1,在循环运行时取余数。

循环的条件是:(decimalNum.intValue()> 1)。

但程序只进行一次循环然后认为BigInteger小于/等于1,而实际上它大约是55193474935748。 为什么会这样?

(“inBinary”是一个ArrayList,用于保存循环中的余数。)

这是while循环:

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
}

2 个答案:

答案 0 :(得分:8)

55,193,474,935,748不适合int:最大的int值是2 31 -1,即2,147,483,647,它小得多。所以你得到一个整数溢出。

这在[{3}},BTW:

中有解释
  

将此BigInteger转换为int。这种转换类似于Java *语言规范5.1.3节中定义的从long到int的缩小原语转换:如果这个BigInteger太大而不适合int,则只返回低位32位。请注意,此转换可能会丢失有关BigInteger值的总体大小的信息,并返回具有相反符号的结果。

如果要将BigInteger与1进行比较,请使用

decimalNum.compareTo(BigInteger.ONE) > 0

答案 1 :(得分:1)

要获取BigInteger的二进制字符串值,您可以执行

bigInteger.toString(2);

编辑:正如@VinceEmigh在评论中提到的,将BigInteger转换为int可能会导致溢出。