1
大学信息技术基础教程
1.2.1.5.1 1.5.1 数制及转换

1.5.1 数制及转换

1)什么是二进制?

首先来考察一下我们熟悉的十进制计数系统。十进制的英文为Decimal,为与其他进制数有所区别,可在十进制数字后面加字母“D”,如169.7D。一个数可以用10个不同的数字符号(0、1、2、3、4、5、6、7、8、9)来表示,每个符号处于十进制数中不同位置时,它代表的实际数值是不同的。例如,169.7代表的实际数值是

(169.7)10=1×102+6×101+9×100+7×10-1

一般地,一个十进制数S可以表示为

S=KnKn-1...K1K0.K-1K-2...K-m

所代表的实际数值是

S=Kn×10n+Kn-1×10n-1+...+K1×101+K0×100

K-1×10-1+K-2×10-2+...+K-m×10-m

其中Kj(j=n,n-1,...,1,0,-1,-2,...,-m)可以是0、1、2、3、4、5、6、7、8、9这10个数字符号中的任何一个。

十进制中的“10”称为十进制的基数(Radix),10j称为Kj的权(Weight)。十进制中低位计满10之后就要向高位进1,即日常所说的“逢十进一”。

同理,二进制的基数是“2”,使用两个不同的数字符号即0和1,采用“逢二进一”的计数规则。二进制的英文为Binary,数字后面加“B”即表示二进制数。例如,二进制数(1010.1)2也可以表示为1010.1B,它代表的实际数值是

(1010.1)2=1×23+0×22+1×21+0×20+l×2-1=(10.5)10

一般地,一个二进制数S可以表示为

S=KnKn-1...K1K0.K-1K-2...K-m

所代表的实际数值是

S=Kn×2n+Kn-1×2n-1+...+K1×21+K0×20

K-1×2-1+K-2×2-2+...+K-m×2-m

其中Kj(j=n,n-1,...,1,0,-1,-2,...,-m)只可以是0或1这两个数字符号中的任何一个。

在日常生活中人们通常使用十进制计数,这是人们长期生活形成的习惯。那么为什么计算机采用二进制,而不采用人们熟悉的十进制呢?

首先,二进制中只有0和1这两个数字符号,使用有两个稳定状态的物理器件就能表示二进制数的每一位,而制造有两个稳定状态的物理器件要比制造有多个稳定状态的物理器件容易得多,且易于实现高速处理。

其次,二进制的运算规则非常简单。

第三,二进制的0和1与逻辑代数的“真”和“假”相吻合,适合计算机将算术运算和逻辑运算联系在一起,统一处理。

2)二进制数的运算

二进制数的运算分为算术运算和逻辑运算两种。最简单的算术运算是加法和减法,其基本运算规则是

img4

基本的逻辑运算有如下三种:逻辑加(也称“或”运算,使用符号“OR”、“∨”或“+”表示)、逻辑乘(也称“与”运算,使用符号“AND”、“∧”或“·”表示)和取反(也称“非”运算,使用符号“NOT”或img5”表示)。它们的基本运算规则是

img6

取反运算最简单,“0”取反后是“1”,“1”取反后是“0”。

需要注意的是,算术运算是会发生进位和借位运算的,而逻辑运算则按位独立进行运算。例如,1010和0110分别进行逻辑加和逻辑乘的运算如下:

img7

3)二进制与其他进制之间的转换

(1)八进制与十六进制

从十进制数和二进制数的概念出发,可以进一步推广到更为一般的任意进制数。最常用的有八进制数和十六进制数两种。

八进制数使用0、1、2、3、4、5、6、7共8个数字符号来表示,逢八进一。八进制的英文为Octal,数字后面加字母“O”即表示一个八进制数,有时为了与数字“0”区别,改为在数字后面加“Q”,如八进制数103.6可以表示为(103.6)8、103.6O或103.6Q。

十六进制数使用0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F共16个数字符号来表示,逢十六进一。十六进制的英文为Hexadecimal,数字后面加字母“H”即表示一个十六进制数,如十六进制数8A.4可以表示为(8A.4)16或8A.4H。表1.2是常用的几种进制的相互转换表。

表1.2 常用的几种进制的相互转换表

img8

(2)二进制数转换成十进制数

采用“按权展开求和法”,注意小数点左边第一位的权为20,小数点右边第一位的权为2-1,例如:

(101.01)2=(1×22+0×21+1×20+0×2-1+1×2-210=(5.25)10

“按权展开求和法”将给定的二进制数转换成十进制数的方法具有普遍意义。用这种方法实现将八进制数、十六进制数转换成为十进制数,仅仅是展开式中的权不同而已。例如:

(103.6)8=(1×82+0×81+3×80+6×8-110=(67.75)10

(8A.4)16=(8×161+10×160+4×16-110=(138.25)10

(3)十进制整数转换成二进制整数

采用“除2逆序取余法”,注意一直要除到商为0为止。例如,将十进制数37转换成二进制数:

img9

即(37)10=(100101)2

显然,这种方法可以推广。若要将十进制整数转换成八进制整数,就可以用“除8逆序取余法”,若要转换成十六进制整数则使用“除16逆序取余法”。在此不再做具体的演算了。

(4)十进制纯小数转换成二进制纯小数

采用“乘2顺序取整法”,即把待转换的十进制纯小数乘以2,取其积的整数部分(0或1)作为二进制小数的最高位,而将其小数部分再乘以2,取第二次乘积的整数部分作为二进制小数的次高位,以此类推,直到小数部分为0或达到所要求的位数为止。注意,最后的结果不要漏掉0和小数点。例如:

将(0.375)10转换成二进制纯小数:

img10

即(0.375)10=(0.011)2

将(0.46)10转换成二进制纯小数:

img11

即(0.46)10=(0.01110)2,是个近似值。

同理,把一个十进制纯小数转换成八进制纯小数可以用“乘8顺序取整法”,转换成十六进制数采用“乘16顺序取整法”。

(5)二进制数转换成八(十六)进制数

以小数点为界,分别向左、向右将每三(四)位分成一组,若最左边或最右边的一组不足三(四)位,则在最左边或最右边以零补足,然后每一组用一位八(十六)进制数表示即可。

例如,将(1010011.10101)2分别转换成八进制数和十六进制数:

img12

(6)八(十六)进制数转换成二进制数

以小数点为界,分别向左、向右将每一位八(十六)进制数展开成三(四)位二进制数,最终最左边和最右边的零可以略去。注意,一位八(十六)进制数的“0”也同样要展开成三(四)位二进制数“000”(“0000”)。

例如,将(306.741)8转换成二进制数:

(306.741)8=(011 000 110.111 100 001)2=(11000110.111100001)2将(2B.08)16转换成二进制数:(2B.08)16=(0010 1011.0000 1000)2=(101011.00001)2