如何用2 ^ 32表示基数?

que*_*ons 7 c c++ numbers

如果我有一个基数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的数字,并使用您的addmul函数累积到您的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的精确倍数.因此转换基本上归结为连接位.

  • +1 downvote是奇怪的.虽然错过了目标的答案有很多上升票!但似乎错误理解的问题已经成熟,我想这就是为什么有好的答案的支持者. (2认同)

Dav*_*nan 5

我们假设我们正在谈论一个基数为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方法相对有效地评估此表达式.

我刚刚把它写下来,我敢打赌,有更高效的基本转换方案.