任意进制之间的转换可以用除k取余法
比如想把M进制转换成K进制,可以用输入数据连续去除K,直到商为零为止,然后把每次所得的余数倒看成一个数,就是相应的K进制数。
将一个十进制数1234转换成八进制数的步骤如下:
无标题.png
则转换结果为2322
将一个八进制数2322转换成十进制数的步骤如下:
image.png
则转换结果为1234
C++实现:
#include <iostream>
using namespace std;
#define MAX_LEN 2000
int convert(char* src, int from, char* dst, int to)
{
int dstLen = 0;
int divisor = 0;
int quotientLen = 0;
bool negative = false;
bool invalidZero = true;
if (*src == '-')
{
*dst = '-';
dst++;
src++;
negative = true;
}
int srcVar[MAX_LEN] = { 0x00 };
int dstVar[MAX_LEN] = { 0x00 };
int srcLen = 0;
while (*src != '\0')
{
if (*src >= '0' && *src <= '9')
{
srcVar[srcLen++] = *src - '0';
}
else
{
srcVar[srcLen++] = *src + 10 - 'A';
}
src++;
}
while (srcLen)
{
for (int i = 0; i < srcLen; i++)
{
divisor = divisor * from + srcVar[i];
if (divisor / to > 0)
{
srcVar[quotientLen++] = divisor / to;
invalidZero = false;
}
else if (divisor / to == 0 && (!invalidZero))
{
srcVar[quotientLen++] = divisor / to;
}
divisor = divisor % to;
}
dstVar[dstLen++] = divisor;
srcLen = quotientLen;
divisor = 0;
quotientLen = 0;
invalidZero = true;
}
for (int i = dstLen - 1; i >= 0; i--)
{
if (dstVar[i] >= 0 && dstVar[i] <= 9)
{
*dst = dstVar[i] + '0';
}
else
{
*dst = dstVar[i] - 10 + 'A';
}
dst++;
}
if (negative)
return dstLen + 1;
else
return dstLen;
}
int main()
{
char src[] = "-FFFFFFFFFF";
char dst[MAX_LEN] = { 0x00 };
int dstLen = convert(src, 16, dst, 8);
for (int i = 0; i < dstLen; i++)
{
cout << dst[i];
}
cout << endl;
return 0;
}
网友评论