如果我有一个基数10或基数16,我该如何将其更改为2 ^ 32?
我试图这样做的原因是为了实现其他成员在这里建议的BigInt .. 为什么要使用更高的基数来实现BigInt?
它是否与整数(基数10)相同,直到2 ^ 32?它之后会发生什么?
Oli*_*rth 12
你试图找到一些形式的东西
a0 + a1 * (2^32) + a2 * (2^32)^2 + a3 * (2^32)^3 + ...
Run Code Online (Sandbox Code Playgroud)
这正是 base-2 32系统的定义,所以请忽略那些告诉你你的问题没有意义的人!
无论如何,你所描述的被称为基本转换.有快速的方法,有简单的方法来解决这个问题.快速的方法非常复杂(有专门讨论这个主题的整本书的章节),我不打算在这里尝试解决它们(尤其是因为我从未试图使用它们).
一种简单的方法是首先在数字系统中实现两个函数,乘法和加法.(即实施BigInt add(BigInt a, BigInt b)和BigInt mul(BigInt a, BigInt b)).一旦你解决了这个问题,你会发现一个基数为10的数字可以表示为:
b0 + b1 * 10 + b2 * 10^2 + b3 * 10^3 + ...
Run Code Online (Sandbox Code Playgroud)
也可以写成:
b0 + 10 * (b1 + 10 * (b2 + 10 * (b3 + ...
Run Code Online (Sandbox Code Playgroud)
因此,如果您在输入字符串中从左向右移动,您可以一次剥离一个基数为10的数字,并使用您的add和mul函数累积到您的BigInt:
BigInt a = 0;
for each digit b {
a = add(mul(a, 10), b);
}
Run Code Online (Sandbox Code Playgroud)
免责声明:此方法的计算效率不高,但至少可以帮助您入门.
注意:从base-16转换要简单得多,因为2 32是16的精确倍数.因此转换基本上归结为连接位.
我们假设我们正在谈论一个基数为10的数字:
a[0]*10^0 + a[1]*10^1 + a[2]*10^2 + a[3]*10^3 + ... + a[N]*10^N
Run Code Online (Sandbox Code Playgroud)
其中每个a[i]都是0到9范围内的数字.
我将假设你可以解析作为输入值的字符串并找到数组a[].一旦你能做到这一点,并假设你已经BigInt用+和*操作员实现了你的课程,那么你就回家了.您可以使用BigInt类的实例简单地评估上面的表达式.
您可以使用Horner方法相对有效地评估此表达式.
我刚刚把它写下来,我敢打赌,有更高效的基本转换方案.