1.1 数制与数制转换
所谓“数制”是指进位计数制,即用进位的方式来计数。同一个数可以采用不同的进位计数制来计量。在日常生活中,人们习惯于使用十进制,而在数字电路中常采用二进制,这意味着,将十进制数输入到数字系统之前,必须要把它转换为二进制数;同样,在一个数字系统的输出部分二进制数也必须要转换为十进制数,以方便人们的读取。除了二进制和十进制外,在数字系统中还广泛地采用八进制和十六进制,由于八进制和十六进制可以方便地与二进制进行相互转换,因此这两种进制一般可以用来表示数值较大的二进制数。
1.1.1 十进制
十进制是人们最常用的一种数制。它有以下特点。
(1)采用10个计数符号(也称数码):0,1,2,3,4,5,6,7,8,9。就是说,十进制数中的任1位,只可能出现这10个符号中的某1个。
(2)十进制数的进位规则是“逢十进一”。即每位计满十就向高位进1,进位基数为10。所谓“基数”,它表示该数制所采用的计数符号的个数及其进位的规则。因此,同一个符号在一个十进制数中的不同位置时,它所代表的数值是不同的。例如,十进制数1976.5可写为:
1976.5=1×103+9×102+7×101+6×100+5×10-1
我们把一种数制中各位计数符号为1时所代表的数值称为该数位的“权”。十进制数中各位的权是基数10的整数次幂。
根据上述特点,任何一个十进制数可以表示为:
式中,ai为基数10的i次幂的系数,它可以是0~9中的任一个计数符号;n为(N)10的整数位个数;m为(N)10的小数位个数;下标10为十进制的进位基数;10i为ai所在位的权。
通常把式(1.1)的表示形式称为按权展开式或多项式表示法。
从计数电路的角度来看,采用十进制是不方便的。因为要构成计数电路,必须把电路的状态跟计数符号对应起来,十进制有10个符号,电路就必须有10个能严格区别的状态与之对应,这样将在技术上带来许多困难,而且也不经济,因此在计数电路中一般不直接采用十进制。
1.1.2 二进制
和十进制类似,二进制具有以下特点。
(1)采用两个符号0和1。
(2)二进制的进位规则为“逢二进一”,即1+1=10(读为“壹零”)。必须注意,这里的“10和十进制中的“10”是完全不同的,它实际上等值于十进制数“2”。
根据上述特点,任何具有n位整数m位小数的二进制数的按权展开式可表示为:
式中,系数ai可以是0或1;下标2表示为二进制。
例如:(101.11)2=1×22+0×21+1×20+1×2-1+1×2-2
根据二进制的特点,目前数字电路普遍采用二进制,其原因如下。
(1)二进制的数字装置简单可靠,所用元器件少。二进制只有两个计数符号0和1,因此它的每一位都可以用任何具有两个不同稳定状态的元件来实现。例如,继电器的闭合和断开,晶体管的饱和与截止等。只要规定一种状态代表“1”,另一种状态代表“0”,就可以表示二进制数。这样使数码的存储和传送变得简单而可靠。
(2)二进制的基本运算规则简单。例如:
加法运算 0+0=0 1+0=0+1=1 1+1=10
乘法运算 0×0=0 0×1=1×0=0 1×1=1
因此二进制数的运算操作简便。
1.1.3 十六进制和八进制
用二进制表示一个数,所用的数位要比十进制多很多,例如表示十进制数(255)10,只需3位,而用二进制表示该数,却需8位,即(11111111)2,不便于书写和记忆。为此常采用十六进制和八进制来表示二进制。上述十进制和二进制的表示法可推广到十六进制和八进制。
十六进制中,采用16个计数符号:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。符号A~F分别对应于十进制数的10~15。进位规则是“逢十六进一”,进位基数是16,十六进制数中各位的权是16的整数次幂。任何一个十六进制数,按权展开式为:
例如:(6D.4B)16=6×161+D×160+4×16-1+B×16-2=6×161+13×160+4×16-1+11×16-2
八进制中,采用八个计数符号:0,1,2,3,4,5,6,7,进位规则是“逢八进一”,进位基数是8。八进制数中各位的权是8的整数次幂,任何一个八进制数的按权展开式为:
例如: (374.6)8=3×82+7×81+4×80+6×8-1
1.1.4 二进制数与十进制数之间的转换
1.二进制数转换为十进制数
将二进制数转换为等值的十进制数,常用按权展开法和基数连乘、连除法。
(1)按权展开法
这种方法是将二进制数按式(1.2)展开,然后按十进制的运算规则求和,即得等值的十进制数。
【例1.1】 将二进制数(1101.101)2转换为等值的十进制数。
解:(1101.101)2=1×23+1×22+0×21+1×20+1×2-1+0×2-2+1×2-3=8+4+0+1+0.5+0+0.125=(13.625)10
简化此法,只要将二进制数中数码为1的那些位的权值相加即可,而数码为0的那些位可以不去管它。
表1.1 2的幂所对应的数
【例1.2】 将二进制数(101101.01)2转换为等值的十进制数。
解:
这种方法要求对2的各次幂值比较熟悉,才能较快地实现转换。表1.1中列出了2的n次幂所表示的24个数。在计算机工作中,210用K(kilo)表示,220用M(mega)表示,230用G(giga)表示,240用T(tera)表示。因此,4K=212=4096,16M=224=16777216。计算机的存储容量通常用字节(B)来表示。一个字节等于8位二进制信息,可以表示键盘上的一个字符。计算机上一个4G的硬盘就能够容纳4G=232字节的数据(大约40亿个字节)。
(2)基数连乘、连除法
二进制数(为了简化分析,假设有4位整数,4位小数)的表示形式可以改写成如下连乘、连除的形式:
式(1.5)中,为了说明运算次序,在式子下面画上了算法线条。可见,用连乘、连除法把二进制数转换为十进制数时,其整数和小数部分的转换方法不完全相同。
(1)整数部分的转换是从整数部分最高位开始的:①将最高位数乘以2,将所得乘积与下1位数相加;②将①所得之和乘以2,其乘积再与更下1位数相加;③这样重复做下去,直到加上整数部分的最低位为止,即得转换后的十进制整数部分。
(2)小数部分的转换是从小数部分最低位开始的:①将最低位数除以2(即×2-1),将所得结果与高1位数相加;②把①所得结果除以2,其结果再与更高1位数相加;这样重复做下去,直到加上小数部分的最高位后,再除以2,即得转换后的十进制小数部分。
(3)最后把整数部分和小数部分相加,即得所求十进制数。
【例1.3】 用基数连乘、连除法将二进制数(11001.101)2转换为等值的十进制数。
解:分别转换二进制数的整数部分和小数部分,然后把两部分加起来。
整数部分(11001)2=(25)10。
小数部分0.101,从最低位开始:1÷2+0=0.5 0.5÷2+1=1.25 1.25÷2=0.625
即小数部分(0.101)2=(0.625)10。
故(11001.101)2=(25.625)10。
2.十进制数转换为二进制数
将二进制数转换为十进制数的两种方法的运算过程反过来,就可以实现十进制数到二进制数的转换。相应的两种方法为:提取2的幂及基数连除、连乘法。
(1)提取2的幂
这种方法是前述用按权展开法将二进制数转换为十进制数运算过程的逆过程,即将十进制数分解为2的幂之和,然后从该和式求得对应的二进制数。
【例1.4】 将十进制数(45)10转换为等值的二进制数。
解:(45)10=32+8+4+1=25+23+22+20=1×25+0×24+1×23+1×22+0×21+1×20=(101101)2
这种方法的关键是要熟悉2的各次幂的值。
(2)基数连除、连乘法
这种方法也是把十进制数的整数部分和小数部分分别进行转换,然后将结果相加。
整数部分采用“除2取余”法转换,即把十进制整数连续除以2,直到商等于零为止,然后把每次所得余数(1或者0)按相反的次序排列,即得转换后的二进制数整数。
【例1.5】 将十进制数(53)10转换为等值的二进制数。
解:
故(53)10=(110101)2。
小数部分采用“乘2取整”法转换,即把十进制小数连续乘以2,直到小数部分为零或者达到规定的位数为止,然后将每次所取整数按序排列,即得转换后的二进制小数。
【例1.6】 将十进制数(0.6875)10转换为等值的二进制数。
解:
故(0.6875)10=(0.1011)2。
以上每一步都是将前一步所得的小数部分乘以2。
【例1.7】 将十进制数(0.37)10转换为二进制数(取小数点后六位)。
解:
故(0.37)10=(0.010111)2。
1.1.5 二进制数与十六进制数及八进制数之间的转换
在数字系统中,八进制和十六进制经常用来作为二进制位串简写的方法。二进制的字符串并不总是表示数值,也可以表示非数字信息的某种代码。当处理较多的二进制位数时,用八进制或十六进制书写二进制数更方便且不易出错。但是,必须清楚,数字电路的所有工作都是以二进制形式进行的,八进制和十六进制仅仅是为了人们的使用方便。
十六进制和八进制与二进制之间的转换比较方便,即4位二进制数对应1位十六进制数,3位二进制数对应1位八进制数。其转换方法为:将二进制数转换为十六进制数(或八进制数)时,从二进制数小数点开始,分别向左、右按4位(转换为十六进制)或3位(转换为八进制)分组,最后不满4位或3位的添0补位。将每组以对应的十六进制数或八进制数代替,即得等值的十六进制数或八进制数。将十六进制数(或八进制数)转换为二进制数时,方法与上述相反。
【例1.8】 将二进制数(111100.101101)2转换成十六进制数。
解:首先将(111100.101101)2写成分组形式:(0011 1100.1011 0100)2,然后将各组4位二进制数转换为十六进制数,得:(3C.B4)16。
【例1.9】 将二进制数(10011101.01)2转换成八进制数。
解:将(10011101.01)2写成分组形式:(010 011 101.010)2,然后将各组3位二进制数转换为八进制数,得:(235.2)8。
【例1.10】 将十六进制数(6FA.35)16转化成二进制数。
解:首先分别将6,F,A,3,5转换为4位二进制数,然后按位的高低依次排列,就得到相应的二进制数:(6FA.35)16=(0110 1111 1010.0011 0101)2。
【例1.11】 将八进制数(347.12)8转换成二进制数。
解:可分别将3,4,7,1,2转换成3位二进制数,按位的高低依次排列,就得到相应的二进制数:
(347.12)8=(011 100 111.001 010)2。