进制转换C++

以下是我总结的一些利用输出流实现简单,进制转换的c++代码.

hex表示16进制;

oct表示8进制;

dec表示10进制;

bitset将整数转换为二进制表示;

#include<iostream>
#include<bitset>//实现位集合(bitset)的功能。
using namespace std;
int main(){
    int n,i;
    cout<<"输出一个数字表示数组大小" <<endl; 
	cin>>n;//定义数组大小 
	long int a[n];
	//以下是将16进制的数据转换为10进制存储在数组中 ,同样的,可以将hex改为oct变为八进制数据转换成10进制存储 
	//默认10进制输入; 
	
	/*注意:不能用不能直接使用cin >> bitset >> a[i]来读取二进制数据并存储到数组中。这是因为bitset是一个模板类,而cin需要接收一个变量来存储输入的值,而不是一个模板类。 
	可以先定义一个string类型存储二进制,然后 
		string binaryStr;
        cin >> binaryStr;
        // 将二进制字符串转换为整数并存储到数组中
        //to_ulong()是C++中std::bitset类的一个成员函数,用于将bitset对象表示的二进制数转换为unsigned long类型的整数。
		//在调用to_ulong()函数时,bitset对象必须能够转换为unsigned long类型,否则可能导致溢出或其他问题。 
        a[i] = bitset<8>(binaryStr).to_ulong(); // 这里假设每个二进制数都是8位 
	*/ 
	for(i=0;i<n;i++){ 
 		cin>>hex>>a[i];//16进制获取数据,其实就是将16进制的数据转换成10进制输入a[i]中 
	}
	for(i=0;i<n;i++){
	cout<<"8进制输出 :"<<oct<<a[i]<<endl;//8进制 
	cout<<"10进制输出:"<<dec<<a[i]<<endl;//10进制 
	cout<<"16进制输出:"<<hex<<a[i]<<endl;//16进制 
	cout<<"2进制输出 :"<<bitset<8>(a[i])<<endl;//2进制,<8>指将整数a[i]以8位二进制形式输出,用这个的时候记得看范围,毕竟2进制表示的范围会比较小 
	cout<<endl<<endl;
	}
}

运行结果如下:

当然我用了long int类型的数组来存储16进制数,但是long int的大小仍然有限,如果16进制数太大,可能会超出long int的表示范围。

所以一般对于数字特别大的数据,一般是用string类型获取数据,并将其转变为2进制,再用二进制转为所需的进制类型。

比如下面这个16进制转成8进制的代码:

#include<iostream>
#include<math.h>
#include<map>
using namespace std;
int main(){
	int n;//n为16进制数的个数 
	cin>>n;
	while(n--){
		string s;//循环获取16进制数 
		cout<<"请输入16进制数:"<<endl; 
		cin>>s;
		
		int len1 = s.length();
		string res1="";//定义一个空字符串存储转为2进制的数据 
		 // 将十六进制数转换为二进制数,(这里16进制字母位当时做的题限制为了大写,你们用的时候注意看小写要不要也为16进制) 
		for (int i=0;i<len1;i++){
			switch(s[i]){
				case '0': res1 += "0000"; break;
				case '1': res1 += "0001"; break;
				case '2': res1 += "0010"; break;
				case '3': res1 += "0011"; break;
				case '4': res1 += "0100"; break;
				case '5': res1 += "0101"; break;
				case '6': res1 += "0110"; break;
				case '7': res1 += "0111"; break;
				case '8': res1 += "1000"; break;
				case '9': res1 += "1001"; break;
				case 'A': res1 += "1010"; break;
				case 'B': res1 += "1011"; break;
				case 'C': res1 += "1100"; break;
				case 'D': res1 += "1101"; break;
				case 'E': res1 += "1110"; break;
				case 'F': res1 += "1111"; break;
			}
		}
		
		// 补齐位数为3的倍数,因为我最后要转为8进制,2进制转8进制想要三个三个转,所以2进制需要变成3的倍数 
		int len2=res1.length() ;
		switch(len2%3){
			case 1: res1 = "00"+res1; break;
			case 2: res1 = "0"+res1; break;
		}
		
		// 将二进制数转换为八进制数
		string res2="";
		len2=res1.length();
		for (int i=0;i<len2;i+=3){
			//从字符串binaryStr中提取长度为3的子字符串,起始位置是i,具体来说,binaryStr.substr(i, 3)会返回从位置i开始的连续3个字符组成的子字符串,其实就是字符。 
			string t = res1.substr(i,3); 
			//因为16进制最前面的数字可能是2,二进制为0010,这时又有补零的情况的话,转成8进制的三个二进制为000,这时将存储8进制数据的res2设为空 
			if (i==0&&t=="000") res2+="";
			//2进制转8进制,因为t[i]是从字符串中获取的字符,t[i]-'0'是将字符变为数字,比如:'8'-'0'=8,字符8减字符0得数字8,用ascll值相减后得出的为数字	
			//最后的加'0'是为了将数字转变为字符类型存储 ,因为最后转为的8进制数比较大,用字符串存储比较好。 
			else res2 += (4*((t[0])-'0')+ 2*((t[1])-'0' )+ ((t[2])-'0'))+'0'; 
			
		}
		cout<<"转成的8进制数为:"<<res2<<endl;
	} 
	
	return 0;
}

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值