进制转换

进制转换

本章介绍常见4个进制之间的转换,附带思路和源码

注意⚠️:源码转换存入字符串后,很多都是倒序的,需要倒序输出

二进制转其他

二进制转八进制

思路:从最低位开始,每三位的值汇总相加存入字符串

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
// str ==> 二进制 ; s ==> 八进制
for(int i=str.size()-1;i>=0;i-=3){
n=0;
m=1;

for(int j=0;j<3;j++){
if(i>=j){
n += (int(str[i-j] - '0') * m);
m*=2;
}
}
s += to_string(n);
}

二进制转十六进制

思路:和八进制类似,但是四位汇总相加,且要判断大于十则转换为字母ABCDEF

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// str ==> 二进制 ; s ==> 十六进制
for(int i=str.size()-1;i>=0;i-=4){
n=0;
m=1;

// 汇总每4位的值
for(int j=0;j<4;j++){
if(i>=j){
n += (int(str[i-j] - '0') * m);
m*=2;
}
}
// 判断大于十则转换成字母存入字符串
if(n>9)
s += (n-10)+'A';
else
s += to_string(n);
}

二进制转十进制

思路:将每一位乘以进制数的位次方数,值相加

Source code

1
2
3
4
5
6
// str ==> 二进制 ; n ==> 十进制
int m =1;
for(int i=str.size()-1,n=0;i>=0;i--){
n+= str[i]*m;
m*=2;
}

十进制转其他

十进制转其他进制方法都是相同的

思路:不断将十进制取模对应的进制数,并判断大于十则转换成字母,存入字符串,再把十进制除以对应的进制数

Source code

1
2
3
4
5
6
7
8
9
10
11
// n ==> 十进制 ; d ==> 进制数(2、8、16)
while(n){
t = n%d;

if(t>9)
str += ('A'+t-10);
else
str += to_string(t);

n/=d;
}

八进制转其他

八进制转二进制

思路:将八进制的每一位拆解成对应的3位二进制存入字符串

注意⚠️:输出时,记得越过前导0

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(int i=0;i<str.size();i++){
m =4;

// 将每一位拆解成三位的二进制
for(int j=0;j<3;j++){
if (n-m>=0){
s2+='1';
n-=m;
}
else
s2+='0';
m /=2;
}
}

八进制转十进制

思路:将八进制的每一位乘以进制数的位次方数,再把值相加

Source code

1
2
3
4
5
6
7
8

// str ==> 八进制 ; ans ==> 十进制
t=1;
for(int i=str.size()-1;i>=0;i--){
n = int(str[i]-'0');
ans += n * t;
t*=8;
}

八进制转十六进制

八进制无法直接转十六进制,需要先转为十进制或二进制,再转为十六进制

十六进制转其他

十六进制转二进制

思路:和八进制类似,不过是将一位拆解成四位二进制数,大于十的字母注意转换成整数型的数字

注意⚠️:输出时,记得越过前导0

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

// str ==> 十六进制 ; s ==> 二进制
for(int i=0;i<str.size();i++){

// 判断大于十
if(str[i]>'9')
n = int((str[i]-'A')+10);
else
n = int(str[i] - '0');

// 拆解成四位
m =8;
for(int j=0;j<4;j++){
if (n-m>=0){
s +='1';
n-=m;
}
else
s +='0';
m /=2;
}
}

十六进制转八进制

十六进制无法直接转为八进制,需要先转为二进制或十进制,再转为八进制

十六进制转十进制

思路:将十六进制的每一位乘以进制数的位次方数,再把值相加

Source code

1
2
3
4
5
6
7
8
9
10
11
// str ==> 十六进制 ; ans ==> 十进制
for(int i=str.size()-1;i>=0;i--){
n = int(str[i]-'0');

// 处理字母,字母A的ascii值比9的值后8位,要去除中间7位
if(n>=10){
n-=7;
}
ans += n * t;
t*=16;
}