我想问下BigInteger是怎样实现以尽可能小的内存存储大整数的?

解决方案 »

  1.   

    你去看看jdk的源代码不就知道了。
    在jdk的安装目录下有一个src.zip
      

  2.   

    当然是看了源代码,但看不明白,谁看过源代码并能还原出类BigInteger的实现原理(采用什么公式或定理及其证明)等可以告诉我么?
      

  3.   

    为什么要知道实现?会调用不就好了。
    Reinventing the wheel...
      

  4.   

    http://topic.csdn.net/u/20090829/21/48938267-4b8c-4ea7-87da-51be71e89c8d.html
      

  5.   

    主要就是用一个int数组来存的 
      

  6.   

    API中文版中的解释BigInteger类
    所有已实现的接口: 
    Serializable, Comparable<BigInteger>不可变的任意精度的整数。所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。 算术运算的语义完全模仿 Java 整数算术运算符的语义,如 The Java Language Specification 中所定义的。例如,以零作为除数的除法抛出 ArithmeticException,而负数除以正数的除法则产生一个负(或零)的余数。Spec 中关于溢出的细节都被忽略了,因为 BigIntegers 所设置的实际大小能适应操作结果的需要。 位移操作的语义扩展了 Java 的位移操作符的语义以允许产生负位移距离。带有负位移距离的右移操作会导致左移操作,反之亦然。忽略无符号的右位移运算符(>>>),因为该操作与由此类提供的“无穷大的词大小”抽象结合使用时毫无意义。 逐位逻辑运算的语义完全模仿 Java 的逐位整数运算符的语义。在执行操作之前,二进制运算符(and、or、xor)对两个操作数中的较短操作数隐式执行符号扩展。 比较操作执行有符号的整数比较,类似于 Java 的关系运算符和相等性运算符执行的比较。 提供的模算术操作用来计算余数、求幂和乘法可逆元。这些方法始终返回非负结果,范围在 0 和 (modulus - 1)(包括)之间。 位操作对其操作数的二进制补码表示形式的单个位进行操作。如有必要,操作数会通过扩展符号来包含指定的位。单一位操作不能产生与正在被操作的 BigInteger 符号不同的 BigInteger,因为它们仅仅影响单个位,并且此类提供的“无穷大词大小”抽象可保证在每个 BigInteger 前存在无穷多的“虚拟符号位”数。 为了简洁明了,在整个 BigInteger 方法的描述中都使用了伪代码。伪代码表达式 (i + j) 是“其值为 BigInteger i 加 BigInteger j 的 BigInteger”的简写。伪代码表达式 (i == j) 是“当且仅当 BigInteger i 表示与 BigInteger j 相同的值时,才为 true”的简写。可以类似地解释其他伪代码表达式。 当为任何输入参数传递 null 对象引用时,此类中的所有方法和构造方法都将抛出 NullPointerException。
      

  7.   

    以上的内容都知道啊,api写的很明显,但我问的是源代码里面的情况,具体的算法与思想
      

  8.   

    学习一下,原理太难看起来好像是维护了一个int[]数组,将序列分在数组里
      

  9.   

    现在看起来它是为了节约内存将大整数的补码分32位32位一截存在一个int数组里
      

  10.   

    API是慢慢看懂的,如果你一看就懂,那就没有必要再学这个了
      

  11.   

    这个问题后来弄懂了,也是很早以前了,今天突然看到所以想补充一下, java里的biginteger的数值是用int数组来存的,但十进制,而是相当于2的16次方进制,即每个数组元素相当于一个位。