• C++进制转换函数


    一、指定格式输出

    1.在C中,按指定进制格式输出如下:

    printf("%05o
    ",35);    //按八进制格式输出,保留5位高位补零
    printf("%03d
    ",35);    //按十进制格式输出,保留3位高位补零
    printf("%05x
    ",35);    //按十六进制格式输出,保留5位高位补零
    /*
    00043
    035
    00035
    */

    2.在C++中,按指定进制格式输出如下:

    #include <bitset>
    #include<iostream>
    using namespace std;
    int main()
    {
        cout << "35的8进制:" << std::oct << 35<< endl;
        cout << "35的10进制" << std::dec << 35 << endl;
        cout << "35的16进制:" << std::hex << 35 << endl;
        cout << "35的2进制: " << bitset<8>(35)<< endl;  //<8>:表示保留8位输出
        return 0;
    }
    /*

    35的8进制:43
    35的10进制35
    35的16进制:23
    35的2进制: 00100011

    */

    二、C/C++各种进制转换库函数

    一)任意2-36进制数转化为10进制数

    int Atoi(string s,int radix)
    {
        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;
    }

    1.  strtol()函数

    函数原型:long int strtol(const char *nptr, char **endptr, int base)

    base是要转化的数的进制,非法字符会赋值给endptr,nptr是要转化的字符

    #include <bitset>
    #include<iostream>
    using namespace std;
    int main()
    {
        char buffer[20]="10549stend#12";
        char *stop;
        int ans=strtol(buffer,&stop,8);  //将八进制1054转成十进制,后面均为非法字符
        cout<<ans<<endl;
        cout<<stop<<endl;
        return 0;
    }
    /*
    556
    9stend#12
    */

    注意:

    ①如果base为0,且字符串不是以0x(或者0X)开头,则按照十进制进行转化。

    ②如果base为0或者16,并且字符串以0X(或者0x)开头,则x(或者X)被忽略,字符串按16进制转化。

    ③如果base不等于0和16,并且字符串以0x(或者0X)开头,则x被视为非法字符。

    ④对于nptr指向的字符串,其开头和结尾的空格被忽略,字符串中间的空格被视为非法字符。

    二)将10进制数转换为任意的n进制数,结果为字符串类型

    注意:std::reverse() 被定义在algorithm头文件中

    #include <algorithm>
    string intToA(int n,int radix)
    {
        string ans="";
        do{
            int t=n%radix;
            if(t>=0&&t<=9) ans+=(t+'0');
            else ans+=(t-10+'a');
            n/=radix;
        }while(n!=0);  //使用do{}while()以防止输入为0的情况
        reverse(ans.begin(),ans.end());
        return ans;
    }

    1. itoa()函数(可以将一个10进制数转换为任意的2-36进制字符串)

    函数原型:char* itoa(int value, char* string, int radix);

    例如:itoa(num,str,2); num是一个int型的,是要转换的10进制数,str是转换结果,后面的值为目标进制。

    #include<cstdio> 
    #include<cstdlib> 
    int main()  
    {  
        int num = 10;  
        char str[100];  
        _itoa(num, str, 2);  //c++中一般用_itoa,用itoa也行,
        printf("%s
    ", str);  
        return 0;  
    }

    三)使用字符串流stringstream(头文件 #include <sstream>)

    1.将八,十六进制转十进制(string转int)

    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
    int main()
    {
        string s="20";
        int a;
        stringstream ss;
        ss<<hex<<s; //以16进制读入流中
        ss>>a;      //10进制int型输出
        cout<<a<<endl;
        return 0;
    }
    //输出:32

    2.将十进制转八,十六进制(int转string)

    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
    int main()
    {
       string s1,s2;
       int a=30;
       stringstream ss;
       ss<<oct<<a; //10进制转成八进制读入流中,再以字符串输出
       ss>>s1;
       cout<<s1<<endl;  //输出:36
       ss.clear();  //不清空可能出错
       ss<<hex<<a;  //10进制转成十六进制读入流中,再以字符串输出
       ss>>s2;
       cout<<s2<<endl; //输出:1e
       return 0;
    }
    天晴了,起飞吧
  • 相关阅读:
    牛客-编程题
    Python 实现一键发布项目
    IDEA MyBatis Log Plugin 收费了,这个可以替代用
    微信 for Windows 内测3.3.0版本,能刷朋友圈啦!
    实况摄像头,“偷窥” 世界美景!
    阿里云盘PC/MAC客户端内测版
    我十年前的工位 vs 我现在的工位
    设置电脑屏保全屏显示时间,酷!
    自我介绍
    Bartender 处理日期格式化
  • 原文地址:https://www.cnblogs.com/jianqiao123/p/14420764.html
Copyright © 2020-2023  润新知