前言
进制之间的转换有两种方法:
-
自定义进制转换函数:将一个n进制的数转换为m进制的数,这个过程需要一个过渡,就是先将一个n进制的数转换为10进制,再将十进制数转换为m进制的数,任意进制转换为十进制的思路就是按权展开,十进制转任意进制就是求余数,直到商数为零,然后逆向取余。
-
调用C++中的STL函数直接转换
一、指定格式转换输出
思路: 直接通过C/C++输出格式转换为相应进制的数。
例如:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <bitset>
using namespace std;
int main(){
printf("%05o\n",300); //按八进制格式输出,保留5位高位补零
printf("%03d\n",300); //按十进制格式输出,保留3位高位补零
printf("%05x\n",300); //按十六进制格式输出,保留5位高位补零
cout<<"300的8进制:" <<std::oct <<300<<endl; //按八进制格式输出
cout<<"300的10进制:" <<std::dec <<300<<endl; //按十进制格式输出
cout<<"300的16进制:" <<std::hex <<300<<endl; //按十六进制格式输出
cout<<"300的2进制:" <<bitset<8>(300)<<endl; //<8>:表示保留8位输出
return 0;
}
输出结果:
二、任意2~36进制数转化为10进制数
自定义进制转换函数:
//m是要转换成的进制,s是给定的m进制下的字符串
//结果为int型
int binary(int m, string s){
int ans=0;
for(int i=0;i<s.size();i++){
char t=s[i];
if(t>='0'&&t<='9')
ans=ans*m+t-'0';
else
ans=ans*m+t-'a'+10;
}
return ans;
}
三、10进制数转换为任意的n进制数
1、自定义进制转换函数:
//n是待转换的十进制数,m是待转换成的进制数
string intToA(int n,int m){
string ans="";
do{ //使用do{}while()循环类型以防止输入为0的情况
int t=n%m;
if(t>=0&&t<=9)
ans+=(t+'0');
else
ans+=(t+'a'-10);
n/=m;
}while(n);
reverse(ans.begin(),ans.end());
return ans;
}
2、_itoa() 函数:
头文件: #include <cstdlib>
作用: 将一个10进制数转换为任意的2-36进制字符串
格式: itoa(num, str, m); num是一个int型的,是要转化的10进制数,str是转化结果,m为目标进制。
代码如下:
#include<cstdio>
#include<cstdlib>
int main(){
int num = 10;
char str[100];
_itoa(num, str, 2); //c++中一般用_itoa,用itoa也行,
printf("%s\n", str);
return 0;
}
四、使用字符串流string,stream进制转换
1、 8、10和16进制字符串转换为int型10进制
代码如下:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
string s="20";
int a,b,c;
stringstream ss1;
ss1<<hex<<s; //以16进制读入流中
ss1>>a; //10进制int型输出
cout<<a<<endl;
stringstream ss2;
ss2<<oct<<s; //以8进制读入流中
ss2>>b; //10进制int型输出
cout<<b<<endl;
stringstream ss3;
ss3<<dec<<s; //以10进制读入流中
ss3>>c; //10进制int型输出
cout<<c<<endl;
return 0;
}
输出结果:
2、int型10进制转换为string型8、10和16进制
代码如下:
#include<cstdio>
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
string s1,s2,s3;
int a=30; //10进制
stringstream ss;
ss<<oct<<a; //10进制转成8进制读入流中
ss>>s1; //以字符串输出
cout<<s1<<endl; //输出:36
ss.clear(); //不清空可能会出错。
ss<<hex<<a; //10进制转成16进制读入流中
ss>>s2; //以字符串输出
cout<<s2<<endl; //输出:1e
ss.clear();
ss<<dec<<a; //10进制转成10进制读入流中
ss>>s3; //以字符串输出
cout<<s3<<endl;
return 0;
}
输出结果: