不同进制之间的转换

17 篇文章 0 订阅

 在这里暂且只讨论整型正数,二、八、十、十六进制之间的相互转换,以后可能会对非整型负数和其他进制进行补充。

       首先,我研究了进制之间相互转换的方法,如下:

     

       从转换关系中,我们推出发现一个结论:任何进制数在转换成十进制数时,均为按权展开相加求和;十进制数在转换成任何进制数时,均为除其进制取余(这两个结论应该不止仅限于二、四、八、十六进制的相互转换)。那么,我们可以选取十进制作为中间进制,即在进行进制转换时,先把初始进制数转换为十进制数,再转换成目标进制数。

       接下来,我们来详细研究一下这个过程。既然以十进制为中间进制,那么我们就需要分为两种情况进行讨论,初始值的进制是十进制 的和不是十进制的。

       首先我们讨论的是初始值不是十进制的情况,因为它相对复杂一些。我们在得到初始值后,需要将其按权展开相加求和,在这之前,我们先来了解一下什么是按权展开相加求和,简单来说就是将其各个位上的数乘以其进制的n(n是这个位上数是这个数的第n位)次方,这样可能比较难以理解,我们来举个例子。

        

      从这个过程中,我们可以想到,这个过程可以用一个for循环输出a[i]*(b^i)做加法(其中a[i]为存放着各个位上值的数组,b为初始值的进制)。我们首先就需要把初始值的各个位上的值放入数组a[i]中,这是我们需要定义的第一个方法,将其命名为Fenjie,作用是把初始值数组化。把初始值数组化之后,我们就要将其先转换为十进制数了,再进行进制转换,这是需要定义的第二个方法,我们将其命名为Zhuanhuan1,作用是把数组化的初始值转换为十进制数。接下来就是把转换好的十进制数转为目标进制数了,再定义我们的第三个方法,将其命名为Zhuanhuan2,作用是把转换后的十进制数再转换为目标进制数。在这里,我们需要思考一个问题,十进制数在转换为目标进制数时,使用的是除其进制而后取余,余数从上往下,但我们需要的是从下往上,就像这样

             
因此,我们需要定义第四个方法Jiaohuan或者用for循环输出时,用减循环将数组倒着输出来。

最后再来理一下这个进制转换的过程:初始值如果非十进制,则先调用Fenjie方法进行数组化,数组化后的初始值调用Zhuanhuan1方法转为十进制,十进制数再调用Zhuanhuan2方法转换为目标进制数。至于初始值是十进制的,直接调用Zhuanhuan1方法进行转换就ok了。

 

高效进制转换的三种方法

1、 使用数组存储数据

#include<iostream>
using namespace std;
char* Convert_16(unsigned long value)
{
    static char Buffer[sizeof(unsigned long)*2+1];//9位 空间大小,静态空间自动赋0
    int mod;
    for(int i=sizeof(unsigned long)*2-1; i>=0; --i)//取模反向存储
    {
        mod = value % 16;
        if(mod < 10)
        {
            Buffer[i] = mod + '0';
        }
        else
        {
            Buffer[i] = (mod-10) + 'A';
        }
        value /= 16;
    }
    return Buffer;
}
void main()
{
    unsigned long value = 4711;
    char *result = Convert_16(value);
    cout<<value<<" = "<<"0x"<<result<<endl;
}

 2.使用栈存储数据 先入后出

#include<iostream>
#include<stack>
using namespace std;
void Convert_16(unsigned long value)
{
    stack<char> st;.//定义栈st 
    int  mod;
    while(value != 0)
    {
        mod = value % 16;
        if(mod < 10)
        {
            st.push(mod+'0');//入栈push
        }
        else
        {
            st.push((mod-10) + 'A');
        }
        value /= 16;
    }
    cout<<value<<" = "<<"0x";
    while(!st.empty())  ///不为空 则出栈 出栈 pop
    {
        cout<<st.top();
        st.pop();
    }
    cout<<endl;
}
void main()
{
    unsigned long value = 4711;
    Convert_16(value);
}

3、使用字符串常量高效转换 推荐*

#include<iostream>
#include<stack>
using namespace std;
char* Convert_16(unsigned long value)
{
    static char Buffer[sizeof(unsigned long)*2+1];
    for(int i=sizeof(unsigned long)*2-1; i>=0; --i)
    {
        Buffer[i] = "0123456789ABCDEF"[value%16];/字符串常量,模直接对应数组的值去存入,把模的结果当做下标,余数为3则存入3;
        value /= 16;
    }
    return Buffer;
}
void main()
{
    unsigned long value = 4711;
    char *result = Convert_16(value);
    cout<<value<<" = "<<"0x"<<result<<endl;
}


--------------------- 
资料:

1.https://blog.csdn.net/qq_37965228/article/details/79648515

2.https://blog.csdn.net/zxh1592000/article/details/78905647

2.C语言实现任意进制数之间的转换https://blog.csdn.net/qq_36454961/article/details/79174645

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术工厂 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值