进制转换(C++):十六进制、二进制、十进制(附源代码)

思路如下:

十进制转二进制:除二求余,得到低位到高位的二进制数字排列 十进制转八进制:除八求余,得到低位到高位的八进制数字排列。

 十进制转十六进制:除十六取余,得到低位到高位的十六进制数字排列,对于 10 ~ 15 转换为 A - F 需要做映射表。

 二进制转十进制:每个二进制位数字乘以该位置的权值,最后求和(权值就是基数的二进制索引次方,索引从 0 开始,比如 2^0)。

 八进制转十进进制:每个八进制位数字乘以该位的权值,最后求和 十六进制转十进制:每个十六进制为数字乘以该位的权值,最后求和。对于 A ~ F 的字母需要查表取数值。

 二进制转八进制:取三合一,即取三个二进制位求十进制数值;从右至左取三合一得到八进制的低位到高位数字排列(左侧取三不够时补 0 凑足) 。

八进制转二进制:取一分三,即取一个八进制位求二进制数字;从左至右取一分三得到二进制的高位到低位数字排列 。

二进制转十六进制:取四合一,即取四个二进制位求十进制数值;从右至左取四合一得到十六进制的低位到高位数字排列(左侧取四不够时补 0 凑足) 。

十六进制转二进制:取一分四,即取一个十六进制为求二进制数字;从左至右取一分四得到二进制的高位到低位的数字排列 八进制和十六进制互相转换借助二进制做中转。

一、十六进制转十进制:

该系列采用C++代码,如有不懂的,可以私信。

解题思想使用了秦九韶算法,可自行百度哦。

源代码:

#include<iostream>

using namespace std;

#define N 16 

int main (){
	string s;
	getline(cin,s);//读入的字符串是char类型
	int decimal=0,bw=1;//decimal:十进制,bw表示幂的次数-1。
	for(int i=s.size()-1;i>=0;i--){
		if(s[i]>=65&&s[i]<=70)
			s[i]=s[i]-'A'+10;//遍历数组,对于大于等于A且小于等于F,进行处理
		else s[i]=s[i]-'0';
	}
	for(int i=s.size()-1;i>=0;i--){
		decimal+=s[i]*bw;
		bw*=N;
	}
	cout<<decimal<<endl;
	return 0;
}

二、十进制转二进制:

源代码:

#include<iostream>
#include<cstdio>

using namespace std;

#define N 2

int main (){
	int decimal,binary[50];
//多次读入,ctrl+z可以结束进程
	while(scanf("%d",&decimal)!=EOF){
		int m=decimal,i=0,r;
//求余赋值,注意i是从0开始计数
		while(m/N>0){
			r=m%N;
			m/=N;
			binary[i++]=r;
		}
		binary[i++]=m;
//逆序输出
		for(int j=i-1;j>=0;j--)
		cout<<binary[i];
	}
	
	return 0;
}

三、二进制转十进制:

#include<iostream>
#include<string>

using namespace std;

#define N 2

int main (){
	string s;
	cin>>s;
	int bw=1,decimal=0;
	for(int i=s.size()-1;i>=0;i--){	
			s[i]=s[i]-'0';
			decimal+=s[i]*bw;
			bw*=N;
	}
	cout<<decimal;
	return 0; 
}

延伸:

使用秦九韶算法:

#include<iostream>

using namespace std;

#define N 2

int main (){
	string s;
	getline(cin,s);
	int res=0;
	for(int i=0;s[i]!='\0';i++)
		res=res*N+s[i]-'0';
	cout<<res<<endl;
	return 0;
}

四、二进制转十六进制:

由于二进制直接转换十六进制,补零方法比较特殊,本人使用二进制转十进制,再转十六进制:

#include<iostream>

using namespace std;

#define N 2
int main (){
	string s;
	getline(cin,s);
	int res=0;
	for(int i=0;s[i]!='\0';i++)
		res=res*N+s[i]-'0';
	//转换十进制,得到res; 
	int m=16,k=0;
	int b[50];
	while(res/m>0){
		b[k++]=res%m;
		res/=m;
	}
	b[k++]=res;
	for(int j=k-1;j>=0;j--){	
			if(b[j]>=10&&b[j]<=15) b[j]=b[j]-10+'A';
			if(b[j]>9)		printf("%c",b[j]);
			else  printf("%d",b[j]);
	}
		
	return 0;
}

本文为学习总结,还望多多指教;

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值