在任何位置数字系统中,任何数字(偶数小数)都表示为 sum(di * basei),其中 di sub> 是i-th 位的数字(从右到左计数),d0 是小数点左侧第一个位置的数字。为了便于评估评估,可以使用Horner's rule“折叠”总和:
(((d[n]*base + d[n-1])*base + d[n-2])*base + d[n-3])*base + ...
这个的好处是可以从最重要的数字开始,然后按照数字在内存或文件字符串中的排序方式向右工作。
string number = "1A";
int decimal = 0;
for (string::const_iterator it = number.begin(); it != number.end(); it++)
decimal = decimal * base + to_int(*it);
to_int() 应该注意将字符转换为其十进制值,例如
int to_int (char d) {
if ('0' <= d && d <= '9')
return d - '0';
else if ('A' <= d && d <= 'J')
return 10 + (d - 'A');
else
throw some error
}
C++ 提供了方便的 stoi() 函数,它会为您计算:
#include <string>
#include <iostream>
using namespace std;
int main (void) {
string number = "1A";
cout << number << " in decimal is " << stoi(number, 0, 20) << endl;
}
编译运行:
$ clang++ -o visc visc.cc && ./visc
1A in decimal is 30
在 C 语言中,可以使用 strtol() 并将基数设置为 20。但它应该用于输入标记器并修改其输入参数,因此应小心。
在 Python 中,string 模块为 atoi() 提供了可选择的基数:
>>> from string import atoi
>>> atoi("1A", 20)
30
其他语言也提供类似的转换功能,主要在它们的字符串处理库中找到。