进制的互相转换

243 阅读6分钟

几种进制的相互转换算法

B(Binary)表示二进制,O(Octal)表示八进制,D或者不写表示十进制,H(Hexadecimal)表示十六进制。

其他进制转换为十进制数据

方法:从低位到高位计算,第0位的权值是进制的0次方,第1位的权值是进制的1次方,第2位的权值是进制的2次方,依次递增下去,把最后的结果相加得到的值就是十进制的值了

二进制->十进制

将二进制的(101011)B转换为十进制

(101011)B = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 + 0*2^4 + 1*2^5 = 43

八进制->十进制

将八进制的(53)O转换为十进制

(53)O = 3*8^0 + 5*8^1 = 43

十六进制->十进制

十六进制就是逢16进1,十六进制的16个数为0123456789ABCDEF。
将十六进制的(2B)H转换为十进制

(2B)H =11*16^0 + 2*16^1 = 43

十进制转成其它进制

方法:用十进制的数除以进制,余数为该权位上的数,而商继续除以进制,余数又为上个权位上的数,依次除下去,直到商为0为止,最后读数的时候,从最后一个余数开始读,一直读到最前面一位的余数。

十进制->二进制

将十进制的43转换为二进制

第一次:43 / 2 = 21.........1
第二次:21 / 2 = 10.........1
第三次: 10 / 2 = 5..........0
第四次: 5 / 2 = 2...........1
第五次: 2 / 2 = 1...........0
第六次:1 / 2 = 0...........1

所以 43 = (101011)B

十进制->八进制

将十进制的43转换为八进制

第一次:43 / 8 = 5.........3
第二次:5 / 8 = 0..........5

所以 43 = (53)O

十进制->十六进制

十六进制就是逢16进1,十六进制的16个数为0123456789ABCDEF。
将十进制的43转换为十六进制

第一次:43 / 16 = 2.........11
第二次:2 / 16 = 0..........2

所以 43 = (2B)H

其它进制之间的相互转换

二进制->八进制

方法:取三合一法,即从二进制的小数点为分界点,向左(向右)每三位取成一位,接着将这三位按权相加,然后按顺序进行排列,小数点位置不变,得到的数字就是我们所求的八进制数。如果向左(向右)取三位后,取到最高(最低)位时候,如果不足三位,可以在小数点最左边(最右边),即整数的最高位(最低点)添0,凑足三位。
将二进制的(11010111.0100111)B转换为八进制的步骤如下:

1. 小数点前111 = 72. 010 = 2;
3. 11补全为011,011 = 3;
4. 小数点后三位010 = 25. 011 = 3;
6. 1补全为100,100 = 4;
读数:从高位到低位,即(11010111.0100111)B = (327.234)O

八进制->二进制

方法:取一分三法,即将一位八进制数分解成三位二进制数,用三位二进制按权相加去凑这位八进制数,小数点位置不变。
将八进制的(327)O转换为二进制的步骤如下

1. 3 = 0112. 2 = 0103. 7 = 111
4. 读数,读数从高位到低位,011010111,即(327) = (11010111)B

二进制->十六进制

方法:取四合一法,即从二进制的小数点为分界点,向左(向右)每四位取成一位,接着将这四位按权相加,然后按顺序进行排列,小数点位置不变,得到的数字就是我们所求的十六进制数。如果向左(向右)取四位后,取到最高(最低)位时候,如果不足四位,可以在小数点最左边(最右边),即整数的最高位(最低点)添0,凑足四位。
将二进制的(11010111)B转换为十六进制的步骤如下:

1. 0111 = 72. 1101 = 13 = D;
3. 读数:(11010111)B = (D7)H

十六进制->二进制

方法:取一分四法,即将一位八进制数分解成四位二进制数,用四位二进制按权相加去凑这位十六进制数,小数点位置不变。
将十六进制的(D7)H转换为二进制的步骤如下:

1. D = 1101;
2. 7 = 0111;
3. 读数:(D7)H = (11010111)B

八进制->十六进制

方法:将八进制转换为二进制,然后再将二进制转换为十六进制,小数点位置不变。
将八进制的(327)O转换为十六进制的步骤如下:

1. 3 = 0112. 2 = 0103. 7 = 111;
4. 此时得到二进制数(011010111)B
5. 0111 = 76. 1101 = 13 = D;
7. 读数:(327)O = (D7)H

十六进制->八进制

方法:将十六进制转换为二进制,然后再将二进制转换为八进制,小数点位置不变。
将十六进制的(D7)H转换为八进制的步骤如下:

1. D = 1101;
2. 7 = 0111;
3. 得到二进制数:11010111;
4. 111 = 75. 010 = 26. 011 = 3;
7. 读数:(D7)H = (327)O;

在JS中如何表示和转换

其他进制转换为十进制数据

// 可以直接用parseInt
let num = parseInt(n1, n2);
// n1: 是需要转换为10进制的数
// n2: 是被转换数据的进制值,如2,8,16等

十进制转成其它进制

// 十进制的数:170 => 十六进制的数:AA
let num1 = parseInt('170'); // 如果这个数是字符串格式的,需要执行这一步
console.log(num1);   // 170
// toString里的参数可以是2,8,16等,设置转换10进制数据到对应进制格式
let num2 = num1.toString(16);
console.log(num2);  // aa

其它进制之间的相互转换

首先将十六进制的'AA'转为二进制的数据

  • 首先将十六进制转换为十进制数据
  • 然后再将所得的十进制数据转为二进制数据
  • 小结:进制之间的转换都是先将其他进制数据转为十进制,再用转好的十进制数据转为其他进制数据
// 首先将十六进制的数:AA => 十进制的数:170
let num1 = parseInt('AA', 16);
console.log(num1);  // 170
let num2 = num1.toString(2);
console.log(num2);   // 10101010