首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
BigInteger大数家法源代码及分析
时间:
2015-11-01 16:30:27
阅读:
419
评论:
0
收藏:
0
[点我收藏+]
标签:
public BigInteger(String val,
int radix) {
int cursor =
0, numDigits;
int len = val.length();
//获取字符串的长度
//不符合条件的情况
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
throw
new NumberFormatException(
"Radix out of range");
if (val.length() ==
0)
throw
new NumberFormatException(
"Zero length BigInteger");
//判断正负,处理掉字符串里面的"-"
signum =
1;
int index = val.lastIndexOf(
"-");
if (index != -
1) {
if (index ==
0) {
if (val.length() ==
1)
throw
new NumberFormatException(
"Zero length BigInteger");
signum = -
1;
cursor =
1;
}
else {
throw
new NumberFormatException(
"Illegal embedded minus sign");
}
}
//跳过前面的0
while (cursor < len &&
Character.digit(val.charAt(cursor),radix) ==
0)
cursor++;
if (cursor == len) {
//若字符串里全是0,则存储为ZERO.mag
signum =
0;
mag = ZERO.mag;
return;
}
else {
//numDigits为实际的有效数字
numDigits = len - cursor;
}
//numDigits位的radix进制数转换为2进制需要多少位
//bitsPerDigit数组里面的元素乘了1024这里就需要右移10位(相当于除以1024),做除法的时候会有
//小数的丢失,因此加1确保位数一定够
//一个int有32bit,因此除以32即是我们开始估算的mag数组的大小
int numBits = (
int)(((numDigits * bitsPerDigit[radix]) >>>
10) +
1);
int numWords = (numBits +
31) /
32;
mag =
new
int[numWords];
//开始按照digitsPerInt截取字符串里的数
//将不够digitsPerInt[radix]的先取出来转换
int firstGroupLen = numDigits % digitsPerInt[radix];
if (firstGroupLen ==
0)
firstGroupLen = digitsPerInt[radix];
//把第一段的数字放入mag数组的最后一位
String group = val.substring(cursor, cursor += firstGroupLen);
mag[mag.length -
1] = Integer.parseInt(group, radix);
if (mag[mag.length -
1] <
0)
throw
new NumberFormatException(
"Illegal digit");
//剩下的一段段转换
int superRadix = intRadix[radix];
int groupVal =
0;
while (cursor < val.length()) {
group = val.substring(cursor, cursor += digitsPerInt[radix]);
groupVal = Integer.parseInt(group, radix);
if (groupVal <
0)
throw
new NumberFormatException(
"Illegal digit");
destructiveMulAdd(mag, superRadix, groupVal);
}
mag = trustedStripLeadingZeroInts(mag);
}
BigInteger大数家法源代码及分析
标签:
原文地址:http://www.cnblogs.com/aishangtaxuefeihong/p/4927865.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!