zoukankan      html  css  js  c++  java
  • 【java.math.BigInteger】【转】常见问题

    好大的链接给原作

    Q: 在java怎样将BigInteger类型的数据转成int类型的?

    A:BigInteger的intValue()可以获得int类型数值。

    Q: java.math.BigInteger有位数限制么?比如long是2的64次方。

    A:从BigInteger的源码可以看出来,在BigInteger内部数值是通过:int[] mag存放数据的,总共可以存放2147483647个int数据,而每个int数据由4个字节表示,所以BigInteger理论上可以存放的数据最大为22147483647*4*8-1-1

    Q: 如何生成一个随机的大数据?

    A:利用BigInteger的构造函数:BigInteger(int numBits, Random rnd)构造一个随机产生的大整数,范围在0到2^numBits – 1之间.

    1 Random r = new Random();
    2 BigInteger data = new BigInteger(100,r);
    3 System.out.println("data:"+data)

    Q: BigInteger的四则运算实现过程是什么样的?

    A:

    1、add方法和subtract方法实际上进行的是数组对位相加和相减,这个过程用私有的函数来完成,返回的是为此重新分配空间的结果数组索引值(数组首地址)。然后再用结果数组来构造一个BigInteger作为最后的返回值。
    2、multiply方法使用的是数组相乘,用数组来模拟数字相乘,同样使用一个私有的函数来完成这个过程,为相乘结果数组分配新的空间,最后用结果数组来构造一个BigInteger 作为返回值。
    3、divide方法实现使用的是MutableBigInteger类,MutableBigInteger类不是公开的,它只供 java.math类库内部使用。MutableBigInteger是BigInteger类的另一个版本,它的特点是不创建临时对象的前提上使调用程 序得到象BigInteger类型的返回值(称为可变对象技术)。因为大整数的除法是由大量的其他算术操作组成的,所以需要大量的临时对象,而完成大量的操作而不创建新的对象可以极大地改善程序的性能,(因为创建对象的代价是很高的)所以在Java的大整数类中使用MutableBigInteger类中 的方法来执行大整数除法。MutableBigInteger类包含在java.math包中,BigInteger类的divide方法使用了 MutableBigInteger类的除法运算所返回的结果,使用这个MutableBigInteger类型的结果来构造一个BigInteger。 实际上在MutableBigInteger类中也使用了数组来模拟数字相除。

    Q: BigInteger为什么设计成不可变的类,是在进行每一步运算时,都会产生一个新的对象的吗?

    A:虽然BigInteger被设计成一个不可变的类,但是并不是每一步运算都生成一个新的对象,可以看下面的源码:

     1 public BigInteger add(BigInteger val) 
     2 {
     3     int[] resultMag;
     4        if (val.signum == 0)
     5         {
     6          return this;
     7         }
     8     if (signum == 0)
     9      {
    10             return val;
    11          }
    12     if (val.signum == signum)
    13           {
    14             return new BigInteger(add(mag, val.mag), signum);
    15           }
    16     int cmp = intArrayCmp(mag, val.mag);
    17     if (cmp==0)
    18       {
    19          return ZERO;
    20       }
    21         resultMag = (cmp>0 ? subtract(mag, val.mag) : subtract(val.mag, mag));
    22         resultMag = trustedStripLeadingZeroInts(resultMag);
    23         return new BigInteger(resultMag, cmp*signum);
    24 }

    Q: 在java中 有没有比BigInteger范围更大的?

    A: 在java中没有比BigInteger范围更大数了。BigInteger类可以处理包含任意长度数字序列的数值,因为在BigInteger内部是通 过int 数组来表示和处理大数据的,int类型的最大值是2147483647,所以int数组最多有21亿个int值,这些数值足够大的,已经满足了超大数据的使用。

    Q: 在哪里可以查看BigInteger的代码实现?

    A: 在jdk里面的java.math包下面就可以看到

  • 相关阅读:
    js简单验证码的生成和验证
    基本够用的php.ini配置文件(CentOS7)
    转发:CentOS下tar压缩排除某个文件夹或文件及解压
    阿里云服务器CentOS7 vsftp安装、设置及后台端口的设置
    转发:entos7修改文件夹权限和用户名用户组
    转发:查看centos中的用户和用户组
    阿里云服务器CentOS7怎么分区格式化/挂载硬盘
    php调试用的几个小方法
    Jquery实现日期转换为 Unix时间戳及时间戳转换日期
    Jquery计算时间戳之间的差值,可返回年,月,日,小时等
  • 原文地址:https://www.cnblogs.com/LLGemini/p/4738608.html
Copyright © 2011-2022 走看看