概述
思路如下:
十进制转二进制:除二求余,得到低位到高位的二进制数字排列 十进制转八进制:除八求余,得到低位到高位的八进制数字排列。
十进制转十六进制:除十六取余,得到低位到高位的十六进制数字排列,对于 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]!='