进制转换的几个办法(自己写成了几个函数)

说明:以下代码在vs2017编译执行通过

函数定义

#include<iostream>
#include<string>
#include<math.h>
#include <algorithm>
#include<iterator>
using namespace std;

int fun_ten_to_two(int num_ten)//十进制数转二进制数
{
	string str;
	while (num_ten)
	{
		if (num_ten % 2)
		{
			str.push_back('1');
		}
		else
		{
			str.push_back('0');
		}
		num_ten = num_ten / 2;
	}
	string::iterator pio_bin = str.begin();
	string::iterator pio_end = str.end();
	reverse(pio_bin, pio_end);
	return stoi(str);
}

int fun_two_to_ten(int two_)//二进制数转十进制数
{
	double temp = 0;
	int ten_ = 0;
	string str_ = to_string(two_);
	reverse(str_.begin(), str_.end());
	string::iterator iter = str_.begin();
	for (int i = 0; iter < str_.end(); iter++)
	{
		temp = *iter - '0';
		ten_ += temp * pow(2, i);
		i++;
	}
	return ten_;
}
//任意2~36进制字符串转化为10进制
int Atoint(string s, int radix_of_s)  //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_of_s + t - '0';
		else ans = ans * radix_of_s + t - 'a' + 10;
	}
	return ans;

}
//任意10进制数转化为2~32进制
string intToA(int n, int target_radix)    //n是待转数字,radix是指定的进制
{
	string ans = "";
	do {
		int t = n % target_radix;
		if (t >= 0 && t <= 9)    ans += t + '0';
		else ans += t - 10 + 'a';
		n /= target_radix;
	} while (n != 0);    //使用do{}while()以防止输入为0的情况
	reverse(ans.begin(), ans.end());
	return ans;
}

//十进制数转换为2~36进制的字符串利用_itoa_s(int , char* ,int,int );
string fun_of_ten_to_all(int& in_ten, int target_radix)
{
	int count = 0;
	string str_target;
	char st[1000];
	for (int i = 0; i < sizeof(st); i++)
	{
		st[i] = '+';
	}
	_itoa_s(in_ten, st, sizeof(st), target_radix);

	for (int i = 0; i < sizeof(st) / sizeof(char); i++)
	{
		if (st[i] == 0)
			break;
		str_target.push_back(st[i]);
	}
	reverse(str_target.begin(), str_target.end());
	return str_target;
}

//2到36进制转化为十进制(利用strol(const char* nptr,char** enptr,int base)函数)
long int fun_of_all_to_ten(string str, int radix_of_str)
{
	char* cha = new char[str.size() + 1];
	string::iterator iter = str.begin();
	for (int i = 0; i < str.size(), iter < str.end(); i++)
	{
		cha[i] = *iter;
		iter++;
	}
	cha[str.size()] = 0;
	long int temp = strtol(cha, NULL, radix_of_str);
	return temp;
}
/*
strtol()函数详解
iteye_15968 2011 - 08 - 07 15:52 : 00  53  收藏
strtol()函数的原型为:

long int strtol(const char *nptr, char **endptr, int base);
	base是nptr的进制

函数的解释说明
这个函数会将参数nptr字符串根据参数base来转换成长整型数。参数base范围从2至36,或0。参数base代表采的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。当base值为0时则是采用10进制做转换,但遇到如’0x’前置字符则会使用16进制做转换、遇到’0’前置字符而不是’0x’的时候会使用8进制做转换。一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。

strtol是atoi的增强版
主要体现在这几方面:
1、不仅可以识别十进制整数,还可以识别其它进制的整数,取决于base参数,比如strtol("0XDEADbeE~~", NULL, 16)返回0xdeadbee的值,strtol("0777~~", NULL, 8)返回0777的值。

2、endptr是一个传出参数,函数返回时指向后面未被识别的第一个字符。例如char *pos; strtol("123abc", &pos, 10); ,strtol返回123,pos指向字符串中的字母a。如果字符串开头没有可识别的整数,例如char *pos; strtol("ABCabc", &pos, 10); ,则strtol返回0,pos指向字符串开头,可以据此判断这种出错的情况,而这是atoi处理不了的。

3、如果字符串中的整数值超出long int的表示范围(上溢或下溢),则strtol返回它所能表示的最大(或最小)整数,并设置errno为ERANGE,例如strtol("0XDEADbeef~~", NULL, 16)返回0x7fffffff并设置errno为ERANGE

多数情况下,endptr设置为NULL, 即不返回非法字符串。*/

main()函数测试

#include<iostream>
#include<math.h>
#include<string>
#include<iterator>
#include<stdlib.h>
#include<iomanip>
using namespace std;

int fun_two_to_ten(int two_);
int fun_ten_to_two(int num_ten);

int Atoint(string s, int radix_of_s);    //s是给定的radix进制字符串
string intToA(int n, int target_radix);    //n是待转的十进制数字,radix是指定的进制

string fun_of_ten_to_all(int& in_ten, int target_radix);
long int fun_of_all_to_ten(string str, int radix_of_str);

int main()
{
	int shi1 = 0;
	cout << "测试fun_ten_to_two函数" << endl;
	cout << "shi1=";
	cin >> shi1;

	int er1 = 0;
	cout << "测试fun_two_to_ten函数" << endl;
	cout << "er1=";
	cin >> er1;

	string str1;
	int radix_of_str1 = 10;
	cout << "测试Atoint函数" << endl;
	cout << "str1=";
	cin >> str1;
	cout << "radix_of_str1=";
	cin >> radix_of_str1;

	int shi2 = 0;
	int target_radix = 10;
	cout << "测试intToA函数" << endl;
	cout << "shi2=";
	cin >> shi2;
	cout << "target_radix=";
	cin >> target_radix;

	int shi3 = 0;
	int target_radix_ = 10;
	cout << "测试fun_of_ten_to_all函数" << endl;
	cout << "shi3=";
	cin >> shi3;
	cout << "target_radix_=";
	cin >> target_radix_;

	string str2;
	int radix_of_str2;
	cout << "测试fun_of_all_to_ten函数" << endl;
	cout << "str2=";
	cin >> str2;
	cout << "radix_of_str2=";
	cin >> radix_of_str2;




	cout << "fun_ten_to_two(shi1)=" <<fun_ten_to_two(shi1)<<endl;
	cout << "\n";
	cout << "fun_two_to_ten(er1)=" << fun_two_to_ten(er1) << endl;
	cout << "\n";
	cout << "Atoint(str1,radix_of_s)=" << Atoint(str1, radix_of_str1) << endl;
	cout << "\n";
	cout << "intToA(shi2,target_radix)=" << intToA(shi2, target_radix) << endl;
	cout << "\n";
	cout << "fun_of_ten_to_all(shi3,target_radix_)=" << fun_of_ten_to_all(shi3, target_radix_) << endl;
	cout << "\n";
	cout << "fun_of_all_to_ten(str2,radix_of_str2)=" << fun_of_all_to_ten(str2, radix_of_str2) << endl;
	cout << "\n";

	return 0;
}

输出

参考资料:strtol()函数详解
C++中的各种进制转换函数汇总

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值