Skip to content

Latest commit

 

History

History
131 lines (84 loc) · 6.04 KB

Positional Notation.md

File metadata and controls

131 lines (84 loc) · 6.04 KB

概述

进位制又称进制,是一种记数方式,亦称位置记法(positional notation)、数字命位法、定位记法、进位记数法、位值记数法(place-value notation)、位置数值系统(positional numeral system);利用这种“记数法”,可以使用有限种“数字符号”来表示所有的数值。

一种进位制中可以使用的数字符号的数目,称为这种进位制的基数或底数。若一个进位制的基数为 n,即可称之为 n 进位制,简称 n 进制。现在最常用的进位制是十进制,这种进位制通常使用 10 个阿拉伯数字(即 0-9 )进行记数。

xbrrkxvq

可以用不同的进位制来表示同一个数,例如十进数 57(10),可以用二进制表示为 111001(2),也可以用五进制表示为 212(5),同时也可以用八进制表示为 71(8),还可用十二进制表示为 49(12),亦可用十六进制表示为 39(16),它们所代表的数值都是一样的。

进制转换

常用的进制转换有二进制、十六进制和十进制之间的互相转换,及二进制和十六进制之间的互相转换。

1. 十进制

任意进制数转换为十进制都是比较简单的,使用权重求和法即可

  1. 将任意进制数的每一位数字乘以该位对应的权重;
  2. 将所有乘积相加,得到最终的十进制数。

其中权重需根据进制类型及进制数的索引值得出。

例如,二进制数对应的索引值从右到左依次为 0、1、2、3 等,那么对应的权重从右到左便依次为 2 的 0、1、2、3 次幂。

假如有二进制数 111001(2) 则其对应的十进制数为:

1*2^5 + 1*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 57(10)

假如有十六进制数 39(16) 则其对应的十进制数为:

3*16^1 + 9*16^0 = 57(10)

其余进制数转换为十进制数亦是如此。但十进制数转换为其他任意进制数的过程就较为麻烦了,常用的计算方法实际上是权重求和法的反推,即递减法。例如,需要将十进制数转换为二进制数,则:

  1. 将十进制数除以 2,得到商和余数;
  2. 将商再除以 2,得到新的商和余数;
  3. 重复步骤 2,直到商为 0;
  4. 将得到的余数逆序排列,即为十进制数的二进制表示。

例如,将十进制数 13(10) 转换为二进制数:

13/2  = 6...1
6/2   = 3...0
3/2   = 1...1
1/2   = 0...1

计算完毕后将余数逆序排列,即得到十进制数 13(10) 的二进制表示 1101(2)。

将十进制数转换为其他进制数的操作亦是如此,例如将十进制数 3249(10) 转换为十六进制数:

3249/16  = 203...1
203/16   = 12...11
12/16    = 0...12

计算完毕后将余数逆序排列,即得到十进制数 3249(10) 的十六进制表示 CB1(16)。

之所以说递减法权重求和法的反推,可以参考二进制数 111001(2) 计算得到十进制数 57(10)的过程:

1*2^5 + 1*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 57(10)

十进制数 57(10) 显然可以拆解为等式左边的 2 次幂表示形式。那么将十进制 57(10) 转换为二进制数时,每次十进制数 57(10) 除以 2 所能够得到的余数实际都为等式左边 2 的 0 次幂的系数。

通过反复地除以 2 即可从右到左依次得到十进制数所对应的二进制数的每一位,逆序排列这些系数即可得到十进制数的二进制表示。

2. 二/十六进制

转换二进制数和十六进制数最快的方法是使用特殊的进制转换规则:从右至左,十六进制数的一位对应着二进制数的四位。例如:

  • 十六进制数 0(16) 对应二进制数 0000(2);
  • 十六进制数 1(16) 对应二进制数 0001(2);
  • 十六进制数 2(16) 对应二进制数 0010(2);
  • ...
  • 十六进制数 D(16) 对应二进制数 1101(2);
  • 十六进制数 E(16) 对应二进制数 1110(2);
  • 十六进制数 F(16) 对应二进制数 1111(2)。

实际的计算是需要借助十进制数来作为转换的桥梁,但由于二进制数和十六进制数之间的特殊关系,使得转换计算只发生在 0~15(10) 之间,这样即便是手动计算也可完成二进制数和十六进制数之间的转换。

根据这个规律,二进制数如果需要转换为十六进制数,则只需要将二进制数从右到左进行四位一组的局部转换即可得到对应的十六位进制数的每一位。

例如,将二进制数 1101101100010(2) 转换为十六进制数:

  1. 二进制数 0010(2) 对应十六进制数 2(16);
  2. 二进制数 0110(2) 对应十六进制数 6(16);
  3. 二进制数 1011(2) 对应十六进制数 B(16);
  4. 二进制数 0001(2) 对应十六进制数 1(16)。

逆序排列后即可得到二进制数 1101101100010(2) 对应的十六进制数即为 1B62(16)。

同理,将任意十六进制数 FACD(16) 转换为二进制数:

  1. 十六进制 D(16) 对应二进制数 1101(2);
  2. 十六进制 C(16) 对应二进制数 1100(2);
  3. 十六进制 A(16) 对应二进制数 1010(2);
  4. 十六进制 F(16) 对应二进制数 1111(2)。

逆序排列后即可得到十六进制数 FACD(16) 对应的二进制数即为 1111101011001101(2)。

3. 八进制

八进制较少使用,但多数情况下是八进制数和二进制数之间的转换,其规则为:从右至左,八进制的一位对应着二进制数的三位。例如:

  • 八进制数 0(8) 对应二进制数 000(2);
  • 八进制数 1(8) 对应二进制数 001(2);
  • 八进制数 2(8) 对应二进制数 010(2);
  • ...
  • 八进制数 7(8) 对应二进制数 111(2)。

例如,将八进制数 73(8) 转换为二进制数:

  1. 八进制数 3(8) 对应二进制数 011(2);
  2. 八进制数 7(8) 对应二进制数 111(2)。

逆序排列后即可得到八进制数 73(8) 对应的二进制数即为 111011(2)。

如果需要作八进制和十六进制之间的转换,则需要通过二进制来完成:

  • 将八进制转换为二进制,再将二进制转换为十六进制。

反之亦然。