码迷,mamicode.com
首页 > 其他好文 > 详细

BigInteger大数家法源代码及分析

时间:2015-11-01 16:30:27      阅读:419      评论:0      收藏:0      [点我收藏+]

标签:

  1. public BigInteger(String val, int radix) {  
  2.           
  3.         int cursor = 0, numDigits;  
  4.         int len = val.length();//获取字符串的长度  
  5.   
  6.         //不符合条件的情况  
  7.         if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)  
  8.             throw new NumberFormatException("Radix out of range");  
  9.         if (val.length() == 0)  
  10.             throw new NumberFormatException("Zero length BigInteger");  
  11.         //判断正负,处理掉字符串里面的"-"  
  12.         signum = 1;  
  13.         int index = val.lastIndexOf("-");  
  14.         if (index != -1) {  
  15.             if (index == 0) {  
  16.                 if (val.length() == 1)  
  17.                     throw new NumberFormatException("Zero length BigInteger");  
  18.                 signum = -1;  
  19.                 cursor = 1;  
  20.             } else {  
  21.                 throw new NumberFormatException("Illegal embedded minus sign");  
  22.             }  
  23.         }  
  24.         //跳过前面的0  
  25.         while (cursor < len &&  
  26.                 Character.digit(val.charAt(cursor),radix) == 0)  
  27.         cursor++;  
  28.         if (cursor == len) {//若字符串里全是0,则存储为ZERO.mag  
  29.             signum = 0;  
  30.             mag = ZERO.mag;  
  31.             return;  
  32.         } else {//numDigits为实际的有效数字  
  33.             numDigits = len - cursor;  
  34.         }  
  35.         //numDigits位的radix进制数转换为2进制需要多少位  
  36.         //bitsPerDigit数组里面的元素乘了1024这里就需要右移10位(相当于除以1024),做除法的时候会有  
  37.         //小数的丢失,因此加1确保位数一定够  
  38.         //一个int有32bit,因此除以32即是我们开始估算的mag数组的大小  
  39.         int numBits = (int)(((numDigits * bitsPerDigit[radix]) >>> 10) + 1);  
  40.         int numWords = (numBits + 31) /32;  
  41.         mag = new int[numWords];  
  42.         //开始按照digitsPerInt截取字符串里的数  
  43.         //将不够digitsPerInt[radix]的先取出来转换  
  44.         int firstGroupLen = numDigits % digitsPerInt[radix];  
  45.         if (firstGroupLen == 0)  
  46.             firstGroupLen = digitsPerInt[radix];  
  47.         //把第一段的数字放入mag数组的最后一位  
  48.         String group = val.substring(cursor, cursor += firstGroupLen);  
  49.             mag[mag.length - 1] = Integer.parseInt(group, radix);  
  50.         if (mag[mag.length - 1] < 0)  
  51.             throw new NumberFormatException("Illegal digit");  
  52.         //剩下的一段段转换  
  53.         int superRadix = intRadix[radix];  
  54.         int groupVal = 0;  
  55.         while (cursor < val.length()) {  
  56.             group = val.substring(cursor, cursor += digitsPerInt[radix]);  
  57.             groupVal = Integer.parseInt(group, radix);  
  58.             if (groupVal < 0)  
  59.             throw new NumberFormatException("Illegal digit");  
  60.                 destructiveMulAdd(mag, superRadix, groupVal);  
  61.         }  
  62.         mag = trustedStripLeadingZeroInts(mag);  
  63.           
  64.     }  

BigInteger大数家法源代码及分析

标签:

原文地址:http://www.cnblogs.com/aishangtaxuefeihong/p/4927865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!