BigInteger存数据的方式

      问题源于一个面试问题,当一个long类型值乘以一个long类型的值,需要用什么来接收,当时第一时间想到用BigInteger类型来接收,但是面试官的问题并不是说让用封装完成的类来接收,一时语塞!!!说下BigInteger的存数据的方式,也没有答上来,回来研究BigInteger的底层操作才明白。

       其实在BigInteger中是使用int类型的数组来存储数据的,在源码中分析看到,这些int类型的数据也是通过二进制数位来实现的,

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就可以了。int的最大值为:2147483647。也就是mag[]里面可以放入2147483647个int值,每个int值为32位,mag[]可以表示的数组范围为:[-22147483647*32-1 ,22147483647*32-1 -1]

    其构造方法有很多,例如: BigInteger(String val),将 BigInteger 的十进制字符串表示形式转换为 BigInteger。BigInteger(String val, int radix)将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。如要将int型的2转换为BigInteger型,要写为BigInteger two=new BigInteger("2");


猜你喜欢

转载自blog.csdn.net/xxzbtjffj/article/details/79782477