zoukankan      html  css  js  c++  java
  • 任意进制的相互转换

    一、前言

         我们平时计算都是使用十进制数,但是有时候我们需要用到二进制数、十六进制数等。在进制转换中,我们主要需要掌握的是十进制转换成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;
    }
  • 相关阅读:
    Git配置SSH访问GitHub
    vue 관련
    node
    关于CheckBox和EditText在ListView里多布局的处理
    百度地图定位
    java常用简单正则表达式写法
    Android二维码开源项目zxing编译
    Andrew XUtils的session获得和cookieStore使用
    常用易忘知识点
    替换Fragment 报错 The specified child already has a parent. You must call removeView()
  • 原文地址:https://www.cnblogs.com/aoguren/p/3326564.html
Copyright © 2011-2022 走看看