本文讲解2进制到16进制之间的进制转换,并通过两道例题,来帮助大家熟练掌握不同进制之间的转换方法。

网上许多教程都是举了一大堆例子,讲了各种数字进制间的转换,搞得初学者摸不着头脑。其实只要掌握各种进制数与十进制之间的互相转化即可。后面计算各个进制数间的转换过程中,拿十进制作为跳板就行了。
1、二、八、十六进制数如何转换成十进制数:
我们以11011这个数来举例:
二进制11011和八进制11011转换成十进制(规律很简单,看图就能懂):

2、十进制数转换成二、八、十六进制数:
我们以110这个数来举例:
十进制110转换成二、八、十六进制(规律很简单,看图就能懂):

掌握以上两部分,也就是搞懂各进制数与十进制数之间的相互转换过程即可,其它进制间的转换只要将十进制数作为跳板就能推出来。比如八进制转换成十六进制,先把八进制转换成十进制,再将十进制转换成十六进制;二进制转换成八进制,先把二进制转换成十进制,再将十进制转换成八进制就行。
可以尝试下以下两道算法题,可以加深对进制转换的理解(这里用C++来讲解):
Acwing801. 二进制中1的个数 (涉及十进制与二进制间的转换)
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
输入格式
第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式
共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。
数据范围
1 ≤ n ≤ 100000
0 ≤ 数列中元素的值 ≤ 10^9
输入样例:
5
1 2 3 4 5
输出样例:
1 1 2 1 2
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
int num;
int res;
int cnt = 0;
while(n--){
cin >> num;
while(num){ //num不等于0时
res = num % 2; //类似短除法每一步求余数
if(res == 1) ++cnt; //余数是1,就让cnt+1
num /= 2; //因为是求二进制,所以每次都除以二
}
cout << cnt << " ";
cnt = 0;
}
return 0;
}
洛谷P1143 进制转换 (涉及各种进制间的转换)
题目描述
请你编一程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A-F表示数码10−15,并且该n进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)。
输出格式
一个正整数,表示转换之后的m进制数。
输入输出样例
输入 #1
16
FF
2
输出 #1
11111111
AC代码:
#include<bits/stdc++.h>
using namespace std;
int char_to_int(char a){ //字符转成数字的方法
return '0' <= a && a <= '9' ? a - '0' : 10 + a - 'A';
}
char int_to_char(int a){ //数字转成字符的方法
return a <= 9 ? '0' + a : a - 10 + 'A';
}
int main(){
int output[35];
int n,m,dec = 0,num = 0;
string input; //输入的数存储为字符串形式
cin >> n >> input >> m;
for(int i = 0; i < input.length(); i++){ //先转成十进制
dec = dec*n + char_to_int(input[i]);
}
while(dec){
output[num++] = dec % m, dec /= m; //再通过十进制为跳板,转为其它进制数
}
for(int i = num - 1; i >= 0; i--){
cout << int_to_char(output[i]); //输出
}
cout << endl;
return 0;
}