c++实现进制转换

目录

进制的相关概念

十进制转非十进制

非十进制转十进制

二进制转八进制

八进制转二进制 

 二进制转十六进制

 十六进制转二进制

 八进制转十六进制

十六进制转八进制 


进制的相关概念

1.数码 

在数制中表示数制大小的符号,比如十进制的数码(0,1,2,3,4,5,6,7,8,9),二进制数码(0,1)

2.基数 

在数制中数码的个数,例如十进制的基数为10,二进制为2

3.位权

在数制中,某位上1所代表的数值的大小称为位权,通常用基数来表示

例如十进制数字123,3的位权10^0,2的位权10^1,1的位权10^2

        二进制数101,最右边1的位权2^0,0的位权2^1,最左边1的位权2^2

十进制转非十进制

方法:用十进制数除以非十进制的基数,取余数倒着写

以十进制数48转二进制为例,

 得到的二进制数为110000

c++实现:

#include <bits/stdc++.h>
using namespace std;
string tranNum(int &num){
	string str;
	int x;
	char op;
	while(num>0){
		x = num % 2;//每一次取得的余数 
		op = '0' + x;//得到的二进制数(字符) 
		str = op + str;//加到字符串里面,注意是加到最前面,因为余数要倒着写,这里不能写成 str = str + op;
		num /= 2; 
	}
	return str;
}
int main(){
	int num;
	string str;//str用来接收字符串型的二进制数
	
	cout << "输入一个十进制数" << endl; 
	cin >> num;
	
	str = tranNum(num);
	
	cout << "对应的二进制数为:" << str;	
} 

输入:48

输出:110000 

如果将十进制数转换为十六进制等大于10的进制,因为涉及到字母,代码如下:

#include <bits/stdc++.h>
using namespace std;

string num_str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

string tranNum(int &num, int &target){
	string str;
	int x;
	char op;
	while(num>0){
		x = num % target;
		op = num_str[x];
		str = op + str;
		num /= target; 
	}
	return str;
}
int main(){
	int num,target;
	string str;
	
	cout << "输入一个十进制数 和 一个您想转换的进制" << endl; 
	cin >> num >> target;
	
	str = tranNum(num,target);
	
	cout << "对应的数为:" << str;	
} 

输入:48 16

输出:30 

非十进制转十进制

方法:乘权求和,每一位数乘以对应的位权相加

以二进制数1111转十进制数为例:

 得十进制数为15

c++实现:

#include <bits/stdc++.h>
using namespace std;
int tranNum(string &str, int &scale){
	int num = 0;
	int i = 0,x;
	char op;
	while(i < str.length()){
		op = str[i];
		if(op >= '0' && op <= '9')
			x = op - '0';
		else if(op >= 'a' && op <= 'z')
			x = op - 'a' + 10;
		else if(op >= 'A' && op <= 'Z')
			x = op - 'A' + 10;
		//乘权求和 
		num = num * scale + x;
		i++;
	} 
	return num;
}
int main(){
	string str;
	int scale;
	cout << "输入一个字符串,一个进制" << endl;
	cin >> str >> scale;
	
	int num = tranNum(str,scale);
	
	cout << "对应的十进制数为:" << num << endl;
} 

输入:1111 2

输出 :15

二进制转八进制

方法:每三位二进制数转换为一位八进制数,先将二进制数3个为一组(如果二进制数的位数不是3的倍数,在右侧补0),然后每三位乘权求和作为八进制的一位

以二进制数1110转八进制为例:

 得八进制数16

c++实现:

#include <bits/stdc++.h>
using namespace std;
char compute(string &num){//返回每三位所对应的数
	char op;
	int number=0;
	for(int i = 0; i < num.size(); i++){
		number = number*2 +num[i]-'0';
	}
	op = '0' + number;
	
	return op;
}
string tranNum(string &str){
	int len = str.length();
	
	if(len % 3 == 1)
		str = "00" + str;
	else if(len % 3 == 2)
		str = "0" + str;
		
	string target;
	for(int i = 0; i< str.length() - 1; i += 3){
		string num = str.substr(i,3);
		char op = compute(num);
		target = target + op;
	}
	return target;
}
int main(){
	string str;
	cout << "请输入一个二进制数:" << endl;
	cin >> str;
	
	string target;
	target = tranNum(str); 
	cout << "八进制数为:" << target << endl;
}

输入:1110

输出:16

八进制转二进制 

 由二进制转八进制可知,每一位八进制数对应三位二进制数,所以,对每一位八进制数把他拆分为三位二进制数,然后组合到一起就可以了

对于八进制数0~7所对应的二进制数,我们可以把它放入一个数组中:

string nums[]={"000","001","010","011","100","101","110","111"};

然后从八进制数的最左边开始,一位一位的转换,转换完成之后,不要忘了把多余的前导0删除

c++实现:

#include <bits/stdc++.h>
using namespace std;
//八进制数0~7所对应的二进制数 
string nums[]={"000","001","010","011","100","101","110","111"};

string tranNum(string &str){
	string target;
	for(int i = 0; i < str.length(); i++){
		int x = str[i]-'0';
		target += nums[x];
	}
	//下面删除多余的前导0
	int count = 0;
	while(target[count] == '0')
		count++;
	target.erase(0,count);
	
	return target; 
}
int main(){
	string str;
	cout << "请输入一个八进制数" << endl;
	cin >> str;
	
	string target = tranNum(str);
	cout << "对应的二进制数为:" << target;
}

输入:10

输出:1000

 二进制转十六进制

方法:与二进制转八进制类似,只不过每四位二进制数对应一位十六进制数,也是先判断二进制数是否为四的倍数,不是则在前面补0,然后再每四位为一组转换

代码如下:

#include <bits/stdc++.h>
using namespace std;
char compute(string &num){//返回每四位所对应的数
	char op;
	int number=0;
	for(int i = 0; i < num.size(); i++){
		number = number*2 +num[i]-'0';
	}

	if(number<10) 
		op = '0' + number;
	else//这一位十六进制就不是数字了,是个字母 
		op= number - 10 + 'A';

	return op;
}
string tranNum(string &str){
	int len = str.length();
	
	if(len % 4 == 1)
		str = "000" + str;
	else if(len % 4 == 2)
		str = "00" + str;
	else if(len % 4 == 3)
		str = "0" + str;
		
	string target;
	for(int i = 0; i< str.length() - 1; i += 4){
		string num = str.substr(i,4);
		char op = compute(num);
		target = target + op;
	}

	return target;
}
int main(){
	string str;
	cout << "请输入一个二进制数:" << endl;
	cin >> str;
	
	string target;
	target = tranNum(str); 
	cout << "十六进制数为:" << target << endl;
}

输入:11110

输出:1E

 十六进制转二进制

方法:与八进制转二进制类似,也是先将每一位十六进制数0~F所对应的二进制数放入一个数组中,然后对每一位十六进制数求得它所对应的二进制数,然后加到一起就可以了

数组:

string nums[]={"0000","0001","0010","0011","0100","0101","0110","0111",
                "1000","1001","1010","1011","1100","1101","1110","1111"};

转换完成之后也是要删除多余的前导0

代码如下:

#include <bits/stdc++.h>
using namespace std;
//十六进制数0~F所对应的二进制数 
string nums[]={"0000","0001","0010","0011","0100","0101","0110",
"0111","1000","1001","1010","1011","1100","1101","1110","1111"};

string tranNum(string &str){
	string target;
	for(int i = 0; i < str.length(); i++){
		int x;
		if(str[i] >= '0' && str[i] <= '9')
			x = str[i] - '0';
		else if(str[i] >= 'A' && str[i] <= 'F')
			x = str[i] - 'A' + 10;
		else if(str[i] >= 'a' && str[i] <= 'f')
			x = str[i] - 'a' + 10;
		target += nums[x];
	}
	//下面删除多余的前导0
	int count = 0;
	while(target[count] == '0')
		count++;
	target.erase(0,count);
	
	return target; 
}
int main(){
	string str;
	cout << "请输入一个十六进制数" << endl;
	cin >> str;
	
	string target = tranNum(str);
	cout << "对应的二进制数为:" << target;
}

输入:F

输出:1111

 八进制转十六进制

方法:把八进制数转换为二进制数,再把二进制数转换为十六进制数即可

代码如下:

#include <bits/stdc++.h>
using namespace std;
//八进制数0~7所对应的二进制数 
string nums_8[]={"000","001","010","011","100","101","110","111"};

char compute(string &num){//返回每四位二进制所对应的十六进制数 
	char op;
	int number=0;
	for(int i = 0; i < num.size(); i++){
		number = number*2 +num[i]-'0';
	}

	if(number<10) 
		op = '0' + number;
	else//这一位十六进制就不是数字了,是个字母 
		op= number - 10 + 'A';

	return op;
}

string tranNum8_2(string &str){//八进制转二进制函数 
	string target_2;
	for(int i = 0; i < str.length(); i++){
		int x = str[i]-'0';
		target_2 += nums_8[x];
	}
	//下面删除多余的前导0
	int count = 0;
	while(target_2[count] == '0')
		count++;
	target_2.erase(0,count);
	
	return target_2; 
}

string tranNum2_16(string &target_2){//二进制转十六进制函数 
	int len = target_2.length();
	
	if(len % 4 == 1)
		target_2 = "000" + target_2;
	else if(len % 4 == 2)
		target_2 = "00" + target_2;
	else if(len % 4 == 3)
		target_2 = "0" + target_2;
		
	string target_16;
	for(int i = 0; i< target_2.length() - 1; i += 4){
		string num = target_2.substr(i,4);
		char op = compute(num);
		target_16 = target_16 + op;
	}

	return target_16;
}

int main(){
	string str;
	cout << "请输入一个八进制数" << endl;
	cin >> str;
	
	string target_2 = tranNum8_2(str);
	string target_16 = tranNum2_16(target_2);
	
	cout << "对应的十六进制数为:" << target_16;
}

输入:1117

输出:24F

十六进制转八进制 

方法:把十六进制数转换为二进制数,再把二进制数转换为八进制数

代码如下:

#include <bits/stdc++.h>
using namespace std;
//十六进制数0~F所对应的二进制数 
string nums_16[]={"0000","0001","0010","0011","0100","0101","0110",
"0111","1000","1001","1010","1011","1100","1101","1110","1111"};

char compute(string &num){//返回每三位二进制所对应的八进制 
	char op;
	int number=0;
	for(int i = 0; i < num.size(); i++){
		number = number*2 +num[i]-'0';
	}
	op = '0' + number;
	
	return op;
}
string tranNum16_2(string &str){
	string target;
	for(int i = 0; i < str.length(); i++){
		int x;
		if(str[i] >= '0' && str[i] <= '9')
			x = str[i] - '0';
		else if(str[i] >= 'A' && str[i] <= 'F')
			x = str[i] - 'A' + 10;
		else if(str[i] >= 'a' && str[i] <= 'f')
			x = str[i] - 'a' + 10;
		target += nums_16[x];
	}
	//下面删除多余的前导0
	int count = 0;
	while(target[count] == '0')
		count++;
	target.erase(0,count);
	
	return target; 
}

string tranNum2_8(string &target_2){
	int len = target_2.length();
	
	if(len % 3 == 1)
		target_2 = "00" + target_2;
	else if(len % 3 == 2)
		target_2 = "0" + target_2;
		
	string target;
	for(int i = 0; i< target_2.length() - 1; i += 3){
		string num = target_2.substr(i,3);
		char op = compute(num);
		target = target + op;
	}
	return target;
}

int main(){
	string str;
	cout << "请输入一个十六进制数" << endl;
	cin >> str;
	
	string target_2 = tranNum16_2(str);
	string target_8 = tranNum2_8(target_2);
	
	cout << "对应的八进制数为:" << target_8;
}

输入:16A

输出:552

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值