栏目:Java8基础 作者:admin 日期:2015-01-03 评论:0 点击: 4,263 次
本文标签: java.math.BigInteger系列教程
本文给大家说一下BigInteger的常见问题,总共有8个常见的问题,如下所示。
答案:BigInteger的intValue()可以获得int类型数值。
答案:在jdk里面的java.math包下面就可以看到
答案:在BigInteger内部定义的 一个代表 数字零 的常量,如下所示:
1 |
public static final BigInteger ZERO = new BigInteger(new int[0], 0); |
答案:在java中没有比BigInteger范围更大数了。BigInteger类可以处理包含任意长度数字序列的数值,因为在BigInteger内部是通过int 数组来表示和处理大数据的,int类型的最大值是2147483647,所以int数组最多有21亿个int值,这些数值足够大的,已经满足了超大数据的使用。
答案:从BigInteger的源码可以看出来,在BigInteger内部数值是通过:int[] mag存放数据的,总共可以存放2147483647个int数据,而每个int数据由4个字节表示,所以BigInteger理论上可以存放的数据最大为22147483647*4*8-1-1
答案:虽然BigInteger被设计成一个不可变的类,但是并不是每一步运算都生成一个新的对象,可以看下面的源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public BigInteger add(BigInteger val) { int[] resultMag; if (val.signum == 0) { return this; } if (signum == 0) { return val; } if (val.signum == signum) { return new BigInteger(add(mag, val.mag), signum); } int cmp = intArrayCmp(mag, val.mag); if (cmp==0) { return ZERO; } resultMag = (cmp>0 ? subtract(mag, val.mag) : subtract(val.mag, mag)); resultMag = trustedStripLeadingZeroInts(resultMag); return new BigInteger(resultMag, cmp*signum); } |
答案:利用BigInteger的构造函数:BigInteger(int numBits, Random rnd)
构造一个随机产生的大整数,范围在0到2^numBits – 1之间.
例如:
1 2 3 |
Random r = new Random(); BigInteger data = new BigInteger(100,r); System.out.println("data:"+data) |
numBit指的是位长。注意:这个构造函数总是用来产生非负的BigInteger。
答案:add方法和subtract方法实际上进行的是数组对位相加和相减,这个过程用私有的函数来完成,返回的是为此重新分配空间的结果数组索引值(数组首地址)。然后再用结果数组来构造一个BigInteger作为最后的返回值。
multiply方法使用的是数组相乘,用数组来模拟数字相乘,同样使用一个私有的函数来完成这个过程,为相乘结果数组分配新的空间,最后用结果数组来构造一个BigInteger 作为返回值。
divide方法实现使用的是MutableBigInteger类,MutableBigInteger类不是公开的,它只供 java.math类库内部使用。MutableBigInteger是BigInteger类的另一个版本,它的特点是不创建临时对象的前提上使调用程序得到象BigInteger类型的返回值(称为可变对象技术)。因为大整数的除法是由大量的其他算术操作组成的,所以需要大量的临时对象,而完成大量的 操作而不创建新的对象可以极大地改善程序的性能,(因为创建对象的代价是很高的)所以在Java的大整数类中使用MutableBigInteger类中的方法来执行大整数除法。MutableBigInteger类包含在java.math包中,BigInteger类的divide方法使用了 MutableBigInteger类的除法运算所返回的结果,使用这个MutableBigInteger类型的结果来构造一个BigInteger。实际上在MutableBigInteger类中也使用了数组来模拟数字相除。
------====== 本站公告 ======------
金丝燕网,一个严谨的网站!