程序员社区

c/c++进制转换方法汇总(含全部代码)

进制转换方法汇总表
原进制 转换进制 方法1 方法2 方法3 方法4
十进制 二进制 bitset指定格式输出   除留余数法 itoa
十进制 八进制 oct/%o指定格式输出 除留余数法 itoa
十进制 十六进制 hex/%x指定格式输出 除留余数法 itoa
十进制 其他进制     除留余数法 itoa
二进制 八进制 三位一组      
二进制 十进制 按权展开     strtol
二进制 十六进制 四位一组      
八进制 二进制 一位换三   除留余数法  
八进制 十进制 按权展开   strtol
八进制 十六进制      
十六进制 二进制 一位换四   除留余数法  
十六进制 八进制      
十六进制 十进制 按权展开   strtol

基本操作函数:

Atoi(string &S, int R) 任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
Itoa(int Num,int R) 十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数

功能实现函数:

ToAll() 十进制转任意进制 调用函数Itoa,自带的itoa
ToDecimal(string &S) 任意进制转十进制函数 调用Atoi函数,strtol函数
ZhiDing() 作用:利用std的hex dec 以及 bitset,c语言的%o,%x
Stream() 作用:利用sstream头文件将数按某进制读入流,输出流

1.任意进制转十进制

【分析】按权展开,求和即可。例如,二进制数110,即4+2+0=6;另外,不想自己写的话,有strtol函数(百度百科)。

long int strtol(const char *nptr,char **endptr,int base);参数:字符串,非法字符指针,字符串中的进制

考虑的很详细,字符串中含有非法的字符(,.*等)时还能停止转换,并返回指针。

2.十进制转任意进制

【分析】除留余数法,逆序输出余数即可。另外,如果自己不想写的话,有itoa函数。

string itoa(int x,char *string,int jz);参数:想要转换的数,转换结果字符串,转换结果的进制

3.指定格式与流

【分析】主要是八进制、十进制和十六进制。对c来说是%o%d,%x;对c++来说是oct,dec,hex。作者感觉所谓的指定格式是输入输出流,sstream的stringstream类是字符串流,本质上应该是差不多的,就写在了一起。学的不深,没有看标准库中类的源代码,请大神指点。

4.二、八、十六之间的转换

【分析】表格里面的一位换四,三位一组之类的是指通过二进制。例如,二进制与八进制进行转换,二进制的110就是八进制的6。反过来,八进制转为二进制,只需要一位转换为三位,6换为110即可。由于也不多,大家都很熟悉,没必要用除留余数法,可以自己写个映射之类的。至于八进制与十六进制的转换,可以利用二进制或十进制作为跳板。(这个代码里面没有,读者可以尝试写一下)

5.全部代码

/*
Project: 进制转换(Radix)
Date:    2019/02/24
Author:  Frank Yu
基本操作函数:
Atoi(string &S, int R) 任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
Itoa(int Num,int R) 十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数
功能实现函数:
ToAll() 十进制转任意进制 调用函数Itoa
ToDecimal(string &S) 任意进制转十进制函数 调用Atoi函数,strtol函数
ZhiDing() 作用:利用std的hex dec 以及 bitset,c语言的%o,%x
Stream() 作用:利用sstream头文件将数按某进制读入流,输出流
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<string>
#include<set>
#include<list>
#include<vector>
#include<map>
#include<iterator>
#include<algorithm>
#include<bitset>
#include<sstream>
#include<iostream>
using namespace std;
#define Max 100
//进制权值
int power(int R,int turn)
{
    int ans = 1;
    while (turn--)
    {
        ans = ans*R;
    }
    return ans;
}
//**************************************基本操作函数**********************************//
//任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
long int Atoi(string &S, int R)
{
    long int ans = 0;
    for (int i=0;i < S.size();i++)//按权展开
    {
        ans += (S[i] - '0') * power(R, S.size() - i - 1);
    }
    /* 网上代码 不理解(已了解,举例,十六进制时t可能为f,那么f-'a'=5,再加10就是15了)  
    int ans=0;
    for (int i = 0;i<s.size();i++)
    {
        char t = s[i];
        if (t >= '0'&&t <= '9') ans = ans*radix + t - '0';
        else ans = ans*radix + t - 'a' + 10;
    }*/
    return ans;
}
//十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数
string Itoa(int Num,int R)
{
  string remain="";
  int temp;
  do {
   temp = Num%R;//取余
   Num /= R;
   if (temp >= 10)
       remain += temp - 10 + 'A';//任意进制为大于基数大于10的进制 例如,十六进制
   else remain += temp + '0';
  } while (Num);
  reverse(remain.begin(),remain.end());//逆序
  return remain;
}
//**************************************功能实现函数**********************************//
//菜单
void menu()
{
    cout << "************1.十进制转任意进制(除留余数)       2.任意进制转为十进制(按权展开)****" << endl;
    cout << "************3.十进制指定格式输出(二、八、十六)  4.利用流****************************" << endl;
    cout << "************5.退出" << endl;
}
void menu1()
{
    cout << "************1.十进制转二进制         2.十进制转八进制****" << endl;
    cout << "************3.十进制转十六进制       4.退出**************" << endl;
}
void menu2()
{
    cout << "************1.十进制转八进制         2.十进制转十六进制**************" << endl;
    cout << "************3.八进制转十进制         4.十六进制转十进制**************" << endl;
    cout << "************5.退出" << endl;
}
//十进制转任意进制 调用函数Itoa,自带的itoa
void ToAll()
{
    int num, R;char str[Max];
    cout << "请输入数和进制:" << endl;
    cin >> num >> R;
    cout << num << "转换为"<<R<<"进制为:" << Itoa(num,R) << endl;
    cout << "利用itoa函数:" <<itoa(num,str,R)<<endl;
}
//任意进制转十进制函数 调用Atoi函数,strtol函数
void ToDecimal(string &S)
{
    int R;
    cout << "请输入数和进制:" << endl;
    cin >>S>>R;
    cout <<S<<"转换为十进制为:"<<Atoi(S, R)<<endl;
    //利用strtol函数 long int strtol(const char *nptr,char **endptr,int base)
    //参数,字符串,非法字符指针,字符串中的进制
    char nptr[Max],*stop;
    strcpy(nptr,S.c_str());//string类型转换为char
    cout<<S << "转换为十进制为(利用strtol函数):" << strtol(nptr,&stop,R) << endl;
}
//作用:利用std的hex dec 以及 bitset,c语言的%o,%x
void ZhiDing()
{
    int num;int choice = 0;
     cout << "请输入十进制数:" << endl;
     cin >> num;
    while (1)
    {
        menu1();
        printf("请输入菜单序号:\n");
        scanf("%d", &choice);
        if (4 == choice) break;
        switch (choice)
        {
        case 1:cout << num <<"转为二进制(利用bitset):"<<bitset<8>(num)<<endl;break;
        case 2: {
                  cout << num << "转为八进制(利用oct):" << oct << num << endl;
                  printf("转为八进制(利用o):%o\n",num);//8位,高位补0
                 }break;
        case 3: {
                   cout << num << "转为十六进制:" << hex << num << endl;
                   printf("转为十六进制(利用x):%x\n", num);
                }break;
        default:printf("输入错误!!!\n");break;
        }
    }
}
//作用:利用sstream头文件将数按某进制读入流,输出流
void Stream()
{
    string s;int choice = 0;
    stringstream ss;int num;
    while (1)
    {
        menu2();
        printf("请输入菜单序号:\n");
        scanf("%d", &choice);
        if (5 == choice) break;
        switch (choice)
        {
        case 1: {
            cout << "请输入一个数:" << endl;
            cin >> num;
            ss.clear();//清空一下,防止出错
            ss << oct << num;//十进制转为八进制读入流中
            ss >> s;//转换的八进制数放入字符串s中
            cout << num << "转为八进制(利用流):" << s << endl;
        }break;
        case 2: {
            cout << "请输入一个数:" << endl;
            cin >> num;
            ss.clear();//清空一下,防止出错
            ss << hex << num;//十进制转为十六进制读入流中
            ss >> s;//转换的十六进制数放入字符串s中
            cout << num << "转为十六进制(利用流):" << s << endl;
        }break;
        case 3: {
            cout << "请输入一个数:" << endl;
            cin >> s;
            ss.clear();//清空一下,防止出错
            ss << oct << s;//将s以八进制形式读入流中
            ss >> num;//以十进制输入到num中
            cout << s << "转为十进制(利用流):" << num << endl;
        }break;
        case 4: {
            cout << "请输入一个数:" << endl;
            cin >> s;
            ss.clear();//清空一下,防止出错
            ss << hex << s;//将s以八进制形式读入流中
            ss >> num;//以十进制输入到num中
            cout << s << "转为十进制(利用流):" << num << endl;
        }break;
        default:printf("输入错误!!!\n");break;
        }
    }
}
//主函数
int main()
{
    int choice = 0;
    string S;
    while (1)
    {
        menu();
        printf("请输入菜单序号:\n");
        scanf("%d", &choice);
        if (5 == choice) break;
        switch (choice)
        {
        case 1:ToAll();break;
        case 2:ToDecimal(S);break;
        case 3:ZhiDing();break;
        case 4:Stream();break;
        default:printf("输入错误!!!\n");break;
        }
    }
    return 0;
}
赞(0) 打赏
未经允许不得转载:IDEA激活码 » c/c++进制转换方法汇总(含全部代码)

一个分享Java & Python知识的社区