C++中的各种进制转换函数汇总

一,指定格式输出

 

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

printf("%05o\n",35);    //按八进制格式输出,保留5位高位补零
printf("%03d\n",35);    //按十进制格式输出,保留3位高位补零
printf("%05x\n",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++各种进制转换库函数

 

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

建议自己写函数,代码如下:

int Atoi(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;
}

    1.strtol()函数(百度百科

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

 

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

 

#include<cstdio>
int main()  
{  
    char buffer[20]="10549stend#12";  
    char *stop;  
    int ans=strtol(buffer, &stop, 8);   //将八进制数1054转成十进制,后面均为非法字符
    printf("%d\n",ans);  
    printf("%s\n", stop);   
    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进制数,结果为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<cstdio> 
#include<cstdlib> 
int main()  
{  
    int num = 10;  
    char str[100];  
    _itoa(num, str, 2);  //c++中一般用_itoa,用itoa也行,
    printf("%s\n", str);  
    return 0;  
}

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

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

#include<cstdio>  
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;  
}  

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

 

    1.将八,十六进制转十进制。

#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.将十进制转八,十六进制。

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

 

  • 186
    点赞
  • 749
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
以下是一个简单的C++函数,用于将大整数从一种进制转换为另一种进制: ```cpp #include <iostream> #include <string> #include <algorithm> #include <cmath> using namespace std; string convertBase(string num, int oldBase, int newBase) { int decimalNum = 0; int power = 1; bool isNegative = (num[0] == '-'); // Convert to decimal base for (int i = num.size() - 1; i >= isNegative ? 1 : 0; i--) { int digitValue = isdigit(num[i]) ? num[i] - '0' : num[i] - 'A' + 10; decimalNum += digitValue * power; power *= oldBase; } // Convert to new base string newNum; while (decimalNum > 0) { int remainder = decimalNum % newBase; char digitChar = (remainder < 10) ? remainder + '0' : remainder - 10 + 'A'; newNum += digitChar; decimalNum /= newBase; } if (newNum.empty()) { newNum = "0"; } if (isNegative) { newNum += '-'; } // Reverse the result and return reverse(newNum.begin(), newNum.end()); return newNum; } int main() { string num; int oldBase, newBase; cout << "Enter a number: "; cin >> num; cout << "Enter the old base: "; cin >> oldBase; cout << "Enter the new base: "; cin >> newBase; cout << num << " in base " << oldBase << " is " << convertBase(num, oldBase, newBase) << " in base " << newBase << endl; return 0; } ``` 该函数使用两个参数:要转换的数字和两个进制值(旧进制和新进制)。它首先将该数字转换为十进制,然后将其转换为新进制。在转换过程,该函数会使用余数和商的计算来获得新进制下的每一位。最后,新数被反转并返回。 请注意,此函数仅适用于非负整数。如果输入数字为负数,则应在函数进行适当的更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值