zoukankan      html  css  js  c++  java
  • C++中的各种进制转换函数汇总及学习

    一.指定格式输出

    1.C中指定格式输出

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

     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;  
    }  

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

    1.任意2~36进制数转化为10进制

    自己实现函数

    int Atoint(string s,int radix)    //s是给定的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;
    }

    strol()函数:

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

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

    例如:

    #include<stdio.h>
    int main()  
    {  
        char a[20]="10549stend#12";  
        char *stop;  
        int ans=strtol(a, &stop, 8);   //将八进制数1054转成十进制,后面均为非法字符
        printf("%d
    ",ans);  
        printf("%s
    ", stop);   
        return 0;
    }
    //输出556

    *注意:

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

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

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

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

    2.将10进制数转换为任意的n进制数,结果为char型。

    自己实现函数

    string intToA(int n,int radix)    //n是待转数字,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<stdio.h> 
    #include<stdlib.h> 
    int main()  
    {  
        int num = 10;  
        char str[100];  
        _itoa(num, str, 2);  //c++中一般用_itoa,用itoa也行,
        printf("%s
    ", str);  
        return 0;  
    }

    2)sprintf()函数(可以将一个10进制数转换为指定格式的n进制字符串)

    函数原型:int sprintf( char *buffer, const char *format, [ argument] … )

    #include<stdio.h>  
    int main()  
    {  
        char s[100]={0};
        sprintf(s, "%d", 123); //十进制输出产生"123"
        sprintf(s, "%4d%4d", 123, 4567); //指定宽度不足的左边补空格,产生:" 1234567"
        sprintf(s, "%8o", 123);    //八进制输出,宽度占8个位置
        sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
        sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"
        int i = 100;
        sprintf(s, "%.2f", i);    //注意这是不对的
        sprintf(s, "%.2f", (double)i);    //要按照这种方式才行
        return 0;  
    }  

    三.使用字符串流string,stream

    1)8,16->10

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

    2)10->8,16

    #include<cstdio>
    #include<iostream>
    #include<string>
    #include<sstream>
    using namespace std;
    int main(void)
    {
        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;
    }
  • 相关阅读:
    平面点集最佳平面
    快速变幻AABB的顶点
    惯性坐标系
    Grapher
    Grapher
    射线到直线方程的转换
    两个运动球的相交性测试
    射线和球的相交性
    Glow Shader
    Shder中实现TintColor
  • 原文地址:https://www.cnblogs.com/zwjjj/p/9953718.html
Copyright © 2011-2022 走看看