计算机只能识别2进制的机器语言,汽车的的车牌号是36进制,进制在生活中随处可见,而进制算法,就是所谓的把一种进制的数字,转化为另一种进制的算法,在C++中,有一些有关进制转换的函数及用法:

C中以八进制,十进制和十六进制都可以通过%o,%d和%x轻松实现,然而唯独没有提供二进制输出的快速方式。
c++中有一些自带的输出方式可以进行进制转换

//#include<bits/stdc++.h>
#include<bitset> //保留位数的头文件 
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	//格式化输出 
	printf("35的八进制是: %05o\n",35);    //按八进制格式输出,保留5位高位补零
	printf("35的十进制是: %03d\n",35);    //按十进制格式输出,保留3位高位补零
	printf("35的十六进制是: %05x\n",35);    //按十六进制格式输出,保留5位高位补零
	//流输入输出 
	cout<<"136的八进制是: "<< oct << 35<< endl;  
	cout<<"136的十进制是: "<< dec << 35 << endl;
	cout<<"136的十六进制是: "<< hex << 35 << endl;
	cout<<"136的二进制是: "<<	bitset<8>(35) << endl;	//<8>:表示保留8位输出
}
}  

但是这仍然是有限的,也许我们除了八进制二进制和十六进制,还需要用到其它进制,这时有两种方法:
##1.使用C++库中自带的函数进行进制转换
strtol 函数:
它的功能是将一个任意1-36进制数转化为10进制数,返回是long int型。

函数为long int strtol(const char *nptr, char **endptr, int base)

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

char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 8));
printf("%s\n", stop);

输出结果:
543
9cend$3

将一个8进制转化为10进制,读取1037,其他后面的为非法字符,转化结果以int型输出来。

另外,如果base为0,且字符串不是以0x(或者0X)开头,则按十进制进行转化。如果base为0或者16,并且字符串以0x(或者0X)开头,那么,x(或者X)被忽略,字符串按16进制转化。如果base不等于0和16,并且字符串以0x(或者0X)开头,那么x被视为非法字符。

最后,需要说明的是,对于nptr指向的字符串,其开头和结尾处的空格被忽视,字符串中间的空格被视为非法字符。

##2.构造函数:
如下代码,可以将十进制的数转化为2到36进制的数:

char ch[4];
void change(int x,int y){
	memset(ch,'0',sizeof(ch));
	int t=0;
	for(int i=0;i<=1000;i++){
	if(y>=10){//进制字符
		if(x%y>=10) ch[i]=x%y+55;
		else ch[i]=x%y+'0';}
	else ch[i]=x%y+'0';
	x/=y;
	t++;
	if(!x) break;
	}
	cout<<setw(4);
	for(int i=t;i>=0;i--)
	cout<<ch[i];
}