原创

BigInteger实现原理

1、把数字存在字符串中,大数之间的四则运算及其它运算都是通过数组完成; 2、JDK实现,那就是BigInteger; 3、BigInteger已实现的接口:Serializable, Comparable 4、signum属性是为了区分:正负数和0的标志位,整数用1表示,负数用-1表示,零用0表示 5、mag是magnitude的缩写形式,mag数组存储BigInteger数值大小
  • big-endian 的顺序,即:高位字节存入低地址,低位字节存入高地址,依次排列的方式
  • little-endian 正好相反
构造方法1
public BigInteger(byte[] val) {
    if (val.length == 0)
        throw new NumberFormatException("Zero length BigInteger");
    if (val[0] < 0) {
        mag = makePositive(val); //这个函数的作用是将负数的byte字节数组转换为正值。
        signum = -1; //如果数组第一个值为负数,则将数组变正存入mag,signum赋-1
    } else {
        mag = stripLeadingZeroBytes(val);//如果非负,则可直接去掉前面无效零,再赋给mag
        signum = (mag.length == 0 ? 0 : 1);
    }
}
构造方法2:直接字符串转BigInteger
public static void main(String[] args) {
    BigInteger bigInteger = new BigInteger("123456789987654321123456789987654321123456789987654321");
    System.out.println(bigInteger);
}

...
//实现,10代表十进制
 public BigInteger(String val) {
    this(val, 10);
}
  • java中int表示-2^31至2^31-1 即-2147483648~2147483647
  • 一个int值最多可保存一个10位十进制的整数,存在溢出,保存9位最好
  • jdk将 18927348347389543834934878 分为18927348 | 347389543 | 834934878保存
  • mag[0]保存18927348 ,mag[1]保存347389543 ,mag[2]保存834934878
6、BigInteger是不可变的任意精度的整数 7、以二进制补码形式表示 BigInteger(如 Java 的基本整数类型) 8、BigInteger 提供所有 Java 的基本整数操作符的对应物 9、并提供 java.lang.Math 的所有相关方法 10、如何mag数组转换为原来的数串
  • 不断做除法取余
正文到此结束
Loading...