日期:2014-05-19  浏览次数:20739 次

Java的BigInteger实现代码看不懂
// bitsPerDigit in the given radix times 1024
  // Rounded up to avoid underallocation.
  private static long bitsPerDigit[] = { 0, 0,
  1024, 1624, 2048, 2378, 2648, 2875, 3072, 3247, 3402, 3543, 3672,
  3790, 3899, 4001, 4096, 4186, 4271, 4350, 4426, 4498, 4567, 4633,
  4696, 4756, 4814, 4870, 4923, 4975, 5025, 5074, 5120, 5166, 5210,
  5253, 5295}; //如何得来的?

  // Pre-allocate array of expected size. May be too large but can
  // never be too small. Typically exact.
  int numBits = (int)(((numDigits * bitsPerDigit[radix]) >>> 10) + 1); //是什么意思?
  int numWords = (numBits + 31) /32;
  mag = new int[numWords];

其中 numDigits 为数字个数,如 "334455", numDigits是6

------解决方案--------------------
楼主想问的是 
这个为什么要这么实现是吧?
我劝LZ暂时不要深究
等你把JDK弄明白了 就会想到为什么要这么实现了
然后你会觉得还有很多其他的实现方式
SUN选择这么做并不是一定要这么做
他要做的只是要选择一种实现的方式把他实现出来 
所有就这么做了

------解决方案--------------------
现在的机器的寄存器是无法放 bigInt 这么大的值的。所以他移位就数据变小,然后用一个 int[] 保存bigInt每一位的值。为什么那个数据阵列会那样取值。可能是和硬件也有点关系。只能发mail去问sun咯。