从十二点到十点的最有效方法是什么?反之亦然?
我尝试过多种转换方式,例如转换为字符串,将每个字符串指定为值,乘以base^exponent
以获取该字符串中的值,然后获取总数。
我想知道,有更好的方法吗?
首先,我将数字存储为十进制的字符串,并希望将其转换为十二进制字符串作为另一个字符串。我还希望能够将基数为12的数字(在一个字符串中)转换为十进制数字(在一个字符串中)。
答案 0 :(得分:2)
如果你只使用base 2作为中间体,这很容易。你可以从任何基数的字符串转换为基数2,如下所示:
int x = strtol("12345", NULL, 10); // convert from base 10 string to integer
int y = strtol("12345", NULL, 12); // convert from base 12 string to integer
然后将转换为基数10是微不足道的:
sprintf(buf, "%d", y); // convert from integer to base 10 string
打印基数12中的数字有点困难 - 没有内置函数已经完成它,所以你需要编写自己的(用一些助手来保持干净):
void reverse(char *s) // reverse a string in place
{
char *e = s + strlen(s) - 1; // find the end of the string
char tmp;
while (s < e) // loop to swap characters and move pointers
{ // towards the middle of the string
tmp = *e;
*e-- = *s;
*s++ = tmp;
}
}
char digit(int x) // turn an integer into a single digit
{
if (x < 10)
return '0' + x; // 0-9
else
return 'a' + x - 10; // a, b, c, d, e, f, g....
}
void tobase(char *s, int x, int base) // convert an integer into a string in
{ // the given base
int r;
char *p = s;
while (x)
{
r = x % base; // extract current digit
x = x / base; // divide to get lined up for next digit
*p++ = digit(r); // convert current digit to character
}
*p = '\0'; // null terminate the string
reverse(s); // and reverse it, since we generated the digits
} // backwards
您可以使用它:
tobase(buf, x, 12); // convert from integer to base 12 string
你可能想要添加比我那里更好的错误处理 - 我正在拍摄一个简短的实现,以便在这里干净地安装它。