任意进制的相互转换

一、前言

     我们平时计算都是使用十进制数,但是有时候我们需要用到二进制数、十六进制数等。在进制转换中,我们主要需要掌握的是十进制转换成N进制和N进制转换成十进制,而对于任意进制之间的相互转换,例如:P进制转换成R进制。

1、将P进制转换成对应的十进制M;

2、将十进制M转换成R进制。

二、进制转换

2.1 进制的基本结构

     提到不同进制的数,就必然要涉及到数的存储,十进制以下的进制数,可以像十进制一样,只是表示数所用的数字受限,如八进制数,只能用数字0~7来表示。而十进制以上的进制数,需要用数字和字母来表示单个位上的数,所以应以字符串方式存储。一般非十进制数采用字符数组的方式存储,数组的一个元素保存数的一位数字。

2.2 P进制转十进制

一般一个K进制的数可以按如下方式表示成十进制数:

  

其中:

所以K进制转成十进制,一般采用按位计算后求和即可。

2.3 十进制转R进制

十进制转R进制,一般也是辗除法,保存每次辗除法的余数,最后将这些余数的顺序颠倒即可。

三、进制转换核心

1、P进制转十进制

     按位求和,总和

2、十进制转R进制

      辗除法,保存每次余数

      颠倒这些余数的顺序

四、代码实现

// 完全翻转字符串
void ReverString(string &s)
{
    int i = 0;
    int j = s.size()-1;
    int temp;
    for (; i<j; i++,j--)
    {
        temp = s[i];
        s[i] = s[j];
        s[j] = temp;
    }
}
void PtoR(string &src, string &dest, int srcBase, int destBase)
{
    int sum = 0;
    int residue = 0;
    string saveResidue;
 
    // PtoD 转10进制
    for (int i=0; src[i]!=''; i++)
    {
        sum *= srcBase;
        if (src[i]>='0'&&src[i]<='9')
        {
            sum += src[i]-'0' +0;        // 字符转数字,可以先减掉基底字符,然后加上基底数字
        }
        else
            sum += src[i]-'A' +10;
    }
 
    // DtoR 10进制转R
    while (sum!=0)
    {
        residue = sum%destBase;
        if (residue>=0&&residue<=9)
        {
            saveResidue += residue-0 +'0';    // 数字转字符,可以先减掉基底数字,然后加上基底字符
        }
        else
            saveResidue += residue-10 + 'A';
        sum = sum/destBase;
    }
    ReverString(saveResidue);
    dest = saveResidue;
}
int main()
{
    string s1 = "C";
    string s;
    PtoR(s1,s,16,18);
    cout << s << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/aoguren/p/3326564.html