栏目:Java8基础 作者:admin 日期:2015-01-11 评论:1 点击: 3,241 次
本文标签: java.math.BigInteger系列教程
在java的整数类型里面,byte为8位,short为16位,int为32位,long为64位。正因为这些数值的二进制位数已经固定,所以它们能表示的数值大小就有一定的范围限制。如果想表示比这些数值更大的数,怎么办呢?可以使用BigInteger来帮忙。此时我们心里一定会有一个疑问,BigInteger用多少位二进制表示呢?其实,在BigInteger里面使用int数组来存储时间的,如下所示:
final int[] mag;
首先看jdk对mag数组的说明:
The magnitude of this BigInteger, in big-endian order: the zeroth element of this array is the most-significant int of the magnitude. The magnitude must be "minimal" in that the most-significant int (mag[0]) must be non-zero.
这段话告诉我们,int[] mag数组里面,是按照big-endian的顺序存储的。可以看下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
private BigInteger(long val) { if (val < 0) { val = -val; signum = -1; } else { signum = 1; } int highWord = (int) (val >>> 32); if (highWord == 0) { mag = new int[1]; mag[0] = (int) val; } else { mag = new int[2]; mag[0] = highWord; mag[1] = (int) val; } } |
val是long类型的数据,共有8个字节,high word为前四个字节,存储到mag[0],后四个字节存储到mag[1]里面,从这个源码中我们也可以看出来,long数值要想获得后四个字节,直接转型为int就可以了。
从上面的介绍,我们已经知道了BigInteger的数据存储情况,它里面是通过int数组存放的。这些int数组里的int数值本质上也是通过二进制数位来实现的。int的最大值为:2147483647。也就是mag[]里面可以放入2147483647个int值,每个int值为32位,mag[]可以表示的数组范围为:[-22147483647*32-1 ,22147483647*32-1 -1]
------====== 本站公告 ======------
金丝燕网,一个严谨的网站!