常见进制转换
一. 进制概述
进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制——X进制,就表示每一位置上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
1.二进制
二进制有两个特点:它由两个数码0,1组成,二进制数运算规律是逢二进一,借位规则是“借一当二”。
例如:1+1=10B,10-1=1B
2. 八进制
八进制的基数R=8=2^3,有数码0、1、2、3、4、5、6、7,并且每个数码正好对应三位二进制数,所以八进制能很好地反映二进制。八进制用下标8或数据后面加O表示 例如:二进制数据 ( 11 101 010 . 010 110 100 )2 对应八进制数据 (352.264)8或352.264O。
3.十进制
十进制的基数为10,数码由0-9组成,计数规律逢十进一。
4.十六进制
十六进制数有两个基本特点:它由十六个数码:数字0~9加上字母A-F组成(它们分别表示十进制数10~15),十六进制数运算规律是逢十六进一,即基数R=16=2^4,通常在表示时用尾部标志H或下标16以示区别。
例如:十六进制数4AC8可写成(4AC8)16,或写成4AC8H。
二. 进制转换
1.十进制整数转二进制整数
十进制整数转换成二进制的方法之一——取余法
因为余数要逆序排列,所以45D = 10 1101B
代码如下:
#include<bits/stdc++.h>
using namespace std;
char B[20]; // 保存二进制
int main() {int D; // 十进制cin >> D;for(int i = 0; ; i++) {B[i] = D%2+'0'; // 取D的余数加上'0',将余数转换成ASCLL码 D /= 2; // D整数2 if(D==0)break;}for(int i = strlen(B)-1; i >= 0; i--) // 因为所得到的余数要逆着写 cout << B[i]; //所以B[i]逆着输出cout << endl;return 0;
}
2.二进制整数转换十进制整数
把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。
2的0次方是1(任何数的0次方都是1,0的0次方无意义)
2的1次方是2
2的2次方是4
2的3次方是8
2的4次方是16
2的5次方是32
2的6次方是64
2的7次方是128
等等
例如:
100011B=32+0+0+0+2+1=35D
代码如下:
#include<bits/stdc++.h>
using namespace std;
char B[20]; // 保存二进制
int main(){cin >> B; // 输入二进制数列 int len = strlen(B); // 二进制数列长度int D=0;int q = 0; // 权值 for(int i = len-1; i >= 0; i--){D = D+(B[i]-'0')*pow(2,q++); } cout << D << endl;return 0;
}
3.十进制整数转八进制整数
十进制转 八进制和十进制转二进制的方法是一样的,区别之一就是需要判断十进制是否大于等于0小于等于8,大于8则取余。
因为余数要逆序排列,所以45D=55O
代码如下:
#include<bits/stdc++.h>
using namespace std;
char O[100];
int main() {int D; // 十进制cin >> D;for(int i = 0; ; i++) {if(D>9)O[i] = D%8+'0';elseO[i] = D+'0';D /= 8;if(D==0)break;}for(int i = strlen(O)-1; i >= 0; i--)cout << O[i];cout << endl;return 0;
}
4. 八进制整数转十进制
八进制转十进制的方法与二进制的方法相似,把八进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。
8的0次方是1(任何数的0次方都是1,0的0次方无意义)
8的1次方是8
8的2次方是16
8的3次方是128
8的4次方是1024
例如:55O = 5 * 8^1 + 5 * 8^0 = 45D
#include<bits/stdc++.h>
using namespace std;
char O[100];
int main() {cin >> O;int len = strlen(O);int D=0;int q = 0; // 权值for(int i = len-1; i >= 0; i--) { //按权相加D = D+(O[i]-'0')*pow(8,q++);}cout << D << endl;return 0;
}
5.十进制整数转换十六进制
(1)循环取余,再整除
(2)小于10的十进制数,按十进制输出
(3)大于9小于16的十进制,按对应的A~F输出
55D = 37H
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main() {int D; //十进制cin >> D;char H[20]; //保存十六进制for(int i = 0; ; i++) {if(D%16>=10 && D%16<16)switch(D%16) { // 十进制对应的十六进制case 10:H[i] = 'A';break;case 11:H[i] = 'B';break;case 12:H[i] = 'C';break;case 13:H[i] = 'D';break;case 14:H[i] = 'E';break;case 15:H[i] = 'F';}elseH[i] = D%16+'0';D /= 16;if(D==0)break;}int len = strlen(H);for(int i = len-1; i>=0; i--) cout << H[i];cout << endl;return 0;
}
6.十六进制整数转换十进制
(1).首先明白16进制数(从右到左数是第0位,第1位,第2位……)的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方,依次这样排列下去。
(2).明白ABCDEF表示的二进制数字分别是10,11,12,13,14,15。
(3).十六进制转换成十进制的公式是:要从右到左用十进制的每个数去乘以16的相应次方,然后这些数字相加就是了
例如:F13DH = 15 * 16^3 + 1 * 16^2 + 3 * 16^1 + 13 * 16^0 = 61757D
#include<bits/stdc++.h>
using namespace std;
int main() {char H_1[20]; // 十六进制数列int H_2[20]; // 保存转换后的十进制的cin >> H_1;int len = strlen(H_1);for(int i = 0; i < len; i++) {if(H_1[i]>= '0' && H_1[i]<='9')H_2[i] = H_1[i] - '0';else {switch(H_1[i]) { // 十六进制对应的十进制case 'A':H_2[i] = H_1[i] - '7';break;case 'B':H_2[i] = H_1[i] - '7';break;case 'C':H_2[i] = H_1[i] - '7';break;case 'D':H_2[i] = H_1[i] - '7';break;case 'E':H_2[i] = H_1[i] - '7';break;case 'F':H_2[i] = H_1[i] - '7';}}}long long p = len, D=0;for(int i = 0; i < len; i++) {//相应的十进制乘以16相应的次方相加D = D + H_2[i] * pow(16,--p);}cout << D << endl;return 0;
}
7.十六进制整数转换八进制
(1).将十六进制转换十进制
(2).再把转换后的十进制转换八进制
上面已介绍几种常见的进制转换,十六进制转换八进制可以看上面的代码,十六转8代码就不写了。
代码可能不够简化,算法比较直接,若有更简单方法留言一起讨论,感谢!!!