一、进位计数制
按进位原则进行计数,称为进位计数制。每一种进位计数制都有一组特定的数字、符号,例如十进制有 101010 个数符,二进制只有 222 个数符,十六进制有 161616 个数符。每种进位计数制中允许使用的数符总数称为基数 或底数 。
在进位计数制中,任何一个数都是由整数和小数两部分组成,并且有两种书写形式:位置计数法和多项式表示法。
1、十进制数(Decimal)
十进制数的特点:
(1)使用 101010 个不同的数符 0、1、2、⋯、90、1、2、\cdots、90、1、2、⋯、9 和一个小数点(...)来表示;
(2)进位规则是 "逢十进一"。
将若干个数符并列放在一起就可以表示一个十进制数。如 435.86435.86435.86 这个十进制数,小数点左边的第一位 555 表示的为个位,它所表示的数值为 555;小数点左边的第二位 333 表示的为十位,它所表示的数值是 3×1013\times10^13×101;小数点左边的第三位 444 表示的是百位,它所表示的数值是 4×1024\times10^24×102;小数点右边的第一位 888 表示的数值是 8×10−18\times10^{-1}8×10−1;小数点右边第二位 666 表示的数值是 6×10−16\times10^{-1}6×10−1. 数符位于不同的数位表示不同的数值。十进制中每一个数字所在的位置表示这个位的大小,称为权 。十进制的基数为 101010,整数的权为 101010 的正次幂,从 100=110^0=1100=1 开始,从右向左递增;小数位的权是 101010 的负次幂,从 10−110^{-1}10−1 开始,从左向右递减。如 435.86435.86435.86 可以表示为:435.86=4×102+3×101+5×100+8×10−1+6×10−2435.86=4\times10^2+3\times10^1+5\times10^0+8\times10^{-1}+6\times10^{-2}435.86=4×102+3×101+5×100+8×10−1+6×10−2上式中左边称为位置计数法 或并列计数法,右边称为多项式表示法 或按权展开法 。
对于任意一个十进制数 NNN,都可以用位置计数法和多项式表示法表示为(N)10=an−1an−2⋯a1a0.a−1a−2⋯a−m=an−1×10n−1+an−2×10n−2+⋯+a1×101+a0×100+ a−1×10−1+a−2×10−2+⋯+a−m×10−m=∑i=−mn−1ai×10i\begin{array}{ll}(N){10}=a{n-1}a_{n-2}\cdots a_1a_0.a_{-1}a_{-2}\cdots a_{-m}\\\kern 28pt=a_{n-1}\times10^{n-1}+a_{n-2}\times10^{n-2}+\cdots+a_1\times10^1+a_0\times10^0\\\kern 38pt+\,a_{-1}\times10^{-1}+a_{-2}\times10^{-2}+\cdots+a_{-m}\times10^{-m}\\\kern 28pt=\displaystyle\sum_{i=-m}^{n-1}a_i\times10^i\end{array}(N)10=an−1an−2⋯a1a0.a−1a−2⋯a−m=an−1×10n−1+an−2×10n−2+⋯+a1×101+a0×100+a−1×10−1+a−2×10−2+⋯+a−m×10−m=i=−m∑n−1ai×10i上式中:nnn 表示的是整数位数;mmm 表示的是小数位数;aia_iai 其中 (−m≤i≤n−1)(-m\le i\le n-1)(−m≤i≤n−1) 表示的是第 iii 位的数符,可以为 0、1、2、3、⋯、90、1、2、3、\cdots、90、1、2、3、⋯、9 中的任意一个;10i10^i10i 表示的为第 iii 为数符的权。我们通常使用下脚注表示括号内的数是什么进制的数,如 (N)10(N)_{10}(N)10 表示 NNN 是一个十进制数。
十进制的表示法可以推广至任意进制数。对于一个基数为 R(R≥2)R(R\ge2)R(R≥2) 的 RRR 进制计数制,数 NNN 可以写成(N)R=an−1an−2⋯a1a0.a−1a−2⋯a−m=an−1×Rn−1+an−2×Rn−2+⋯+a1×R1+a0×R0+ a−1×R−1+a−2×R−2+⋯+a−m×R−m=∑i=−mn−1aiRi\begin{array}{ll}(N)R=a{n-1}a_{n-2}\cdots a_1a_0.a_{-1}a_{-2}\cdots a_{-m}\\\kern 27pt=a_{n-1}\times R^{n-1}+a_{n-2}\times R^{n-2}+\cdots+ a_1\times R^1+a_0\times R^0\\\kern 37pt+\,a_{-1}\times R^{-1}+a_{-2}\times R^{-2}+\cdots +a_{-m}\times R^{-m}\\\kern 27pt=\displaystyle\sum_{i=-m}^{n-1}a_iR^{i}\end{array}(N)R=an−1an−2⋯a1a0.a−1a−2⋯a−m=an−1×Rn−1+an−2×Rn−2+⋯+a1×R1+a0×R0+a−1×R−1+a−2×R−2+⋯+a−m×R−m=i=−m∑n−1aiRi上式中:nnn 表示整数位数;mmm 表示小数位数;aia_iai 表示第 iii 为数符,它可以是 0、1、⋯、R−10、1、\cdots、R-10、1、⋯、R−1 中的任意一个;RiR^iRi 表示第 iii 为数符的权。
2、二进制数(Binary)
二进制数进位规则是 "逢二进一",与十进制数一样,它也是加权数,其基数 R=2R=2R=2,它的每位数符的取值只能是 000 或 111,每位的权都是 222 的幂。二进制整数中,最右边的位是最低有效位(least significant bit,LSB) ,相应的权是 20=12^0=120=1;每位的权从右到左以 222 的幂次增加,最左边的位是最高有效位(most significant bit,MSB) .
同十进制一样,二进制的小数部分也是将小数部分的二进制数写在小数点右边,在小数部分中,最左边的位是最高位,相应的权是 2−1=0.52^{-1}=0.52−1=0.5,每位数符的小数的权以 222 的负次幂从左向右减小。下表给出了二进制位数、权和十进制的对应关系。

任何一个二进制数都可表示为(N)2=an−1an−2⋯a2a1.a−1a−2⋯a−m=an−1×2n−1+an−2×2n−2+⋯+a1×21+a0×20+ a−1×2−1+a−2×2−2+⋯+a−m×2−m=∑i=−mn−1ai2i\begin{array}{ll}(N)2=a{n-1}a_{n-2}\cdots a_2a_1.a_{-1}a_{-2}\cdots a_{-m}\\\kern 25pt=a_{n-1}\times2^{n-1}+a_{n-2}\times2^{n-2}+\cdots+a_1\times2^1+a_0\times2^0\\\kern 35pt+\,a_{-1}\times2^{-1}+a_{-2}\times2^{-2}+\cdots+a_{-m}\times2^{-m}\\\kern 25pt=\displaystyle\sum_{i=-m}^{n-1}a_i2^i\end{array}(N)2=an−1an−2⋯a2a1.a−1a−2⋯a−m=an−1×2n−1+an−2×2n−2+⋯+a1×21+a0×20+a−1×2−1+a−2×2−2+⋯+a−m×2−m=i=−m∑n−1ai2i如 (1011.011)2(1011.011)_2(1011.011)2 可以表示为:(1011.011)2=1×23+0×22+1×21+1×20+0×2−1+1×2−2+1×2−3=(11.375)10\begin{array}{l}(1011.011)2=1\times2^3+0\times2^2+1\times2^1+1\times2^0+0\times2^{-1}+1\times2^{-2}+1\times2^{-3}\\\kern 53pt=(11.375){10}\end{array}(1011.011)2=1×23+0×22+1×21+1×20+0×2−1+1×2−2+1×2−3=(11.375)10二级制数的特点如下:
(1)二进制数只有 0、10、10、1 两个数符。数字电路中利用一个开关器件就可以表示一位二进制数,其电路容易实现,且工作稳定可靠。
(2)二进制数的算术运算和十进制数的算术运算规则相似,不同的是二进制数是 "逢二进一" 和 "借一当二",十进制是 "逢十进一" 和 "借一当十"。如:
需要注意的是,加法的进位和减法的借位。而乘法运算是由左移被乘数与加法运算组成,除法的运算是由右移被除数和减法运算组成。
3、八进制数(Octal)
八进制数主要作用是提供了一个简便的方法来表示二进制数,但是在计算机和微处理器的输入和输出中,表示二进制时,八进制要比十六进制用的要少。
八进制数的进位规则是 "逢八进一",其基数 R=8R=8R=8,由八个数字组成,分别是:0、1、2、3、4、5、6、7、80、1、2、3、4、5、6、7、80、1、2、3、4、5、6、7、8,它每位的权是 888 的幂。任何一个八进制数都可以表示为 (N)8=∑i=−mn−1ai8i(N)8=\sum{i=-m}^{n-1}a_i8^i(N)8=i=−m∑n−1ai8i如 (376.4)8(376.4)_8(376.4)8 的表示:(376.4)8=3×82+7×81+6×80+4×8−1=3×64+7×8+6+0.5=(254.5)10\begin{array}{l}(376.4)8=3\times8^2+7\times8^1+6\times8^0+4\times8^{-1}\\\kern 39pt=3\times64+7\times8+6+0.5\\\kern 39pt=(254.5){10}\end{array}(376.4)8=3×82+7×81+6×80+4×8−1=3×64+7×8+6+0.5=(254.5)10
4、十六进制数(Hexadecimal)
十六进制数有 161616 个数符,它主要作为一种显示或者书写二进制的简洁方法,这是因为二进制数和十六进制数之间的转换非常容易。长的二进制数阅读和书写都非常困难,因为很容易丢失或者颠倒某个位。
十六进制数的特点如下:
(1)使用的 161616 个数符为 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F0、1、2、3、4、5、6、7、8、9、\textrm{A}、\textrm{B}、\textrm{C}、\textrm{D}、\textrm{E}、\textrm{F}0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F. 其中符号 A∼F\textrm{A}\sim \textrm{F}A∼F 表示十进制数中的 10∼1510\sim1510∼15.
(2)进位规则是 "逢十六进一",其基数 R=16R=16R=16,每位的权都是 161616 的幂。
任何一个十六进制数都可以表示为(N)16=∑i=−mn−1ai16i(N){16}=\sum{i=-m}^{n-1}a_i16^i(N)16=i=−m∑n−1ai16i例如:(3AB.11)16=3×162+10×161+11×160+1×16−1+1×16−2≈(939.0664)10(3\textrm{AB}.11){16}=3\times16^2+10\times16^1+11\times16^0+1\times16^{-1}+1\times16^{-2}\approx(939.0664){10}(3AB.11)16=3×162+10×161+11×160+1×16−1+1×16−2≈(939.0664)10
二、进位进数制之间的转换
1、二进制与十进制之间的转换
1) 二进制数转换成十进制数 ------ 按权展开法
将二进制数写成按权展开的多项式,然后按照十进制数的规则进行运算,即可以得到相应的十进制数。如:(10110.11)2=1×24+1×22+1×21+1×2−1+1×2−2=(22.75)10(10110.11)2=1\times2^4+1\times2^2+1\times2^1+1\times2^{-1}+1\times2^{-2}=(22.75){10}(10110.11)2=1×24+1×22+1×21+1×2−1+1×2−2=(22.75)10同理,将任意进制数转换为十进制数,只需要将数 (N)R(N)R(N)R 写成按权展开的多项式,再按十进制的规则进行运算,就可以求得其相应的十进制数 (N)10(N){10}(N)10.
2) 十进制数转换成二进制数
十进制的数转换成二进制数时,需要分别对其整数部分和小数部分进行转换。
(1)整数转换 ------ 除 222 取余法 。这是将一个给定的十进制数转换成二进制数的一个系统的方法,我们将这个十进制数不断的除以 222,直至商为 000,则所有的余数就构成了二进制数。其原理如下:将十进制整数 (N)10(N){10}(N)10 转换为二进制整数 (N)2(N)2(N)2,其转换前后应相等,则有(N)10=an−1×2n−1+an−2×2n−2+⋯+a1×21+a0×20=2(an−1×2n−2+an−2×2n−3+⋯+a2×21+a1)+a0=2Q1+a0\begin{array}{l}(N){10}=a{n-1}\times2^{n-1}+a_{n-2}\times2^{n-2}+\cdots+a_1\times2^1+a_0\times2^0\\\kern 29pt=2(a_{n-1}\times2^{n-2}+a_{n-2}\times2^{n-3}+\cdots+a_2\times2^1+a_1)+a_0\\\kern 29pt=2Q_1+a_0\end{array}(N)10=an−1×2n−1+an−2×2n−2+⋯+a1×21+a0×20=2(an−1×2n−2+an−2×2n−3+⋯+a2×21+a1)+a0=2Q1+a0将上式两边同时除以 222,则得到的商为Q1=an−1×2n−2+an−2×2n−3+⋯+a2×21+a1余数为 a0Q_1=a_{n-1}\times2^{n-2}+a_{n-2}\times2^{n-3}+\cdots+a_2\times2^1+a_1\kern 10pt余数为\,\pmb{a_0}Q1=an−1×2n−2+an−2×2n−3+⋯+a2×21+a1余数为a0然后,再将上式两边同时除以 222,得到新的商为Q2=an−1×2n−3+an−2×2n−4+⋯+a2余数为 a1Q_2=a_{n-1}\times2^{n-3}+a_{n-2}\times2^{n-4}+\cdots+a_2\kern 10pt余数为\,\pmb{a_1}Q2=an−1×2n−3+an−2×2n−4+⋯+a2余数为a1不断重复上述过程,直到得到的商为 Qn=0Q_n=0Qn=0,余数为 an−1a_{n-1}an−1,这样就得到了二进制每一位的数符 a0、a1、⋯、an−1a_0、a_1、\cdots、a_{n-1}a0、a1、⋯、an−1.
例如,将 (57)10(57){10}(57)10 转换成二进制数:
所以(57)10=(111001)2(57){10}=(111001)_2(57)10=(111001)2
(2)小数转换 ------ 乘 222 取整法 。 我们可以通过将十进制的小数重复乘 222,然后取整数部分的方法来进行十进制到二进制的转换,所得到的第一个进位是 MSB\textrm{MSB}MSB. 原理如下:十进制小数 (N)10(N){10}(N)10 转换为二进制的小数 (N)2(N)2(N)2,转换前后应相等,则(N)10=a−1×2−1+a−2×2−2+⋯+a−m×2−m(N){10}=a{-1}\times2^{-1}+a_{-2}\times2^{-2}+\cdots +a_{-m}\times2^{-m}(N)10=a−1×2−1+a−2×2−2+⋯+a−m×2−m将上式两边同时乘以 222,可得到2(N)10=a−1+(a−2×2−1+⋯+a−m×2−m+1)=a−1+F12(N){10}=a{-1}+(a_{-2}\times2^{-1}+\cdots+a_{-m}\times2^{-m+1})=a_{-1}+F_12(N)10=a−1+(a−2×2−1+⋯+a−m×2−m+1)=a−1+F1可以看到,2(N)102(N){10}2(N)10 的整数部分就是 a−1a{-1}a−1,小数部分为 F1F_1F1。我们再将 2(N)102(N){10}2(N)10 的小数部分 F1F_1F1 再乘以 222,则得到2F1=a−2+(a−3×2−1+⋯+a−m×2−m+2)=a−2+F22F_1=a{-2}+(a_{-3}\times2^{-1}+\cdots+a_{-m}\times2^{-m+2})=a_{-2}+F_22F1=a−2+(a−3×2−1+⋯+a−m×2−m+2)=a−2+F22F12F_12F1 的整数部分就是 a−2a_{-2}a−2,小数部分是 F2F_2F2。重复上述步骤,就可以求得二进制小数每位的数符 a−1、a−2、⋯、a−ma_{-1}、a_{-2}、\cdots、a_{-m}a−1、a−2、⋯、a−m.
例如,将 (0.724)10(0.724)_{10}(0.724)10 转换二进制小数的过程:
所以有 (0.724)10≈(0.1011)2(0.724)_{10}\approx(0.1011)_2(0.724)10≈(0.1011)2从上述例子中我们看到,小数部分乘 222 取整的过程无法做到最后的乘积一定为零,因此这个转换值是存在有一定的误差。通常情况下,我们在二进制小数的精度达到所需要的精度,或者最终的乘积为零,就可以结束转换了。
将一个带有整数和小数的十进制数转换为二进制数时,必须将整数部分和小数部分分别按照除 222 取余法和乘 222 取整法来计算,让后将两者的结果合并起来。
同理,如果将十进制数转换成任意的 RRR 进制 (N)R(N)_R(N)R,则整数部分可以使用除 RRR 取余法,小数部分可以采用乘 RRR 取整法。
2、二进制数与八进制数、十六进制数之间的相互转换
八进制和十六进制的基数分别为 8=238=2^38=23 和 16=2416=2^416=24,333 位二进制数正好相当于 111 位八进制数,444 位二进制数正好相当于 111 位十六进制数,它们之间可以很容易的进行相互转换。
二进制转换成八进制数同样要从小数点开始,分别从小数点向左、向右将二进制数按照每 333 位分为一组(不足 333 位的补 000 ,整数的最左边和小数的最右边补 000,不会影响二进制数的值),然后将每一组都写成等值的八进制数,就完成了二进制数到八进制数的转换。
例如,将 (1101111010.1011)2(1101111010.1011)_2(1101111010.1011)2 转换成八进制数:二进制001‾ 101‾111‾ 010‾.101‾ 100‾八进制1572.54\begin{array}{ll}二进制&\underline{001}\,\underline{101}\underline{111}\,\underline{010}.\underline{101}\,\underline{100}\\八进制&\kern 5pt1\kern 13pt5\kern 11pt7\kern 13pt2\kern 6pt.\kern 5pt5\kern 13pt4\end{array}二进制八进制001101111010.1011001572.54因此(1101111010.1011)2=(1572.54)8(1101111010.1011)_2=(1572.54)_8(1101111010.1011)2=(1572.54)8二进制数转换成十六进制数的方法与二进制数转换成八进制的方法类似,只是每 333 位一组改为每 444 位一组(不足 444 位的补 000),然后将每一组都写成等值的十六进制数就可以了。
例如,将 (1101101011.101)2(1101101011.101)_2(1101101011.101)2 转换成十六进制数:二进制0011‾ 0110‾ 1011‾.1010‾十六进制36B.A\begin{array}{cl}二进制&\underline{0011}\,\underline{0110}\,\underline{1011}.\underline{1010}\\十六进制&\kern 8pt3\kern 17pt6\kern 17pt\textrm B\kern 8pt.\kern 6pt\textrm A\end{array}二进制十六进制001101101011.101036B.A因此 (1101101011.101)2=(36B.A)16(1101101011.101)2=(36\textrm{B.A}){16}(1101101011.101)2=(36B.A)16八进制数、十六进制数转换为二进制数是上面的逆运算,我们只需要将八进制数的每一位用 333 位二进制数来代替,十六进制数的每一位用 444 位二进制数代替即可。
例如,分别将 (375.46)8、(678.A5)16(375.46)8、(678.\textrm A5){16}(375.46)8、(678.A5)16 转换为二进制数:八进制375.46十六进制678.A5二进制011 111 101 . 100 110二进制0110 0111 1000 . 1010 0101\begin{array}{clcl}八进制&\kern 5pt3\kern 13pt7\kern 14pt5\kern 8pt.\kern 8pt4\kern 14pt6&十六进制&\kern 7pt6\kern 19pt7\kern 19pt8\kern 10pt.\kern 9pt\textrm A\kern 18pt5\\二进制&011\,\,111\,\,101\,\,.\,\,100\,\,110&二进制&0110\,\,0111\,\,1000\,\,.\,\,1010\,\,0101\end{array}八进制二进制375.46011111101.100110十六进制二进制678.A5011001111000.10100101因此(375.46)8=(011111101.100110)2(678.A5)16=(011001111000.10100101)2(375.46)_8=(011111101.100110)2\\(678.\textrm A5){16}=(011001111000.10100101)_2(375.46)8=(011111101.100110)2(678.A5)16=(011001111000.10100101)2