购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 二进制及进制转换

二进制(Binary)在数学和数字电路中是指以2为基数的记数系统,是计算技术中广泛采用的一种数制,由德国数学家莱布尼茨于1679年发明。在二进制系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示数字。在数字电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备都用到了二进制。

2.1.1 二进制的优势

在计算机系统内部,所有的信息都采用二进制(即0和1)来表示。之所以采用二进制,原因如下。

· 二进制在物理上实现简单,制造有两个稳定状态的物理器件比制造有多个稳定状态的物理器件容易得多,而且两个稳定状态的物理器件一般来说也更为可靠,例如,用高低电压或脉冲的有无或磁铁的N/S极等都可以方便、可靠地来表示“0”和“1”。

· 二进制信息在传输时也简单、可靠。例如,对于电压为5V的电路,如果在某个点测量到的电压在2V以下,则表示传输了信息位“0”,而电压在2V以上则表示传输了信息位“1”,这种电路很容易实现,抗干扰能力也较强。而三进制的情况下,要区分电压是0~1.5V(表示信息位“0”)、1.5~3.5V(表示信息位“1”)还是3.5~5V(表示信息位“2”)则困难许多,对于四进制、八进制,其难度成倍增加,抗干扰能力也随之减弱。

· 二进制的编码、计数和运算规则都很简单,例如十进制的乘法口诀表有45条规则,而二进制的乘法只有4种情况,因此用开关电路就可以实现,简便易行。

· 从逻辑上讲,由于二进制的0和1正好与逻辑代码的假和真相对应,有逻辑代数的理论基础,因此用二进制可以自然地表示二值逻辑。

2.1.2 二进制与其他进制

除了二进制外,实际上还有许多不同的进制,例如我们日常生活中经常用到的十进制。对于一个进制而言,首先需要确定每个数位的取值范围及进位规则,例如,对于十进制,我们使用0、1、2、3、4、5、6、7、8、9这10个符号来表示每个数位上的取值范围,并规定0+1=1,1+1=2,2+1=3,…,8+1=9,而对于某些运算,例如9+1,则规定其结果为0,并且需要进位(即逢十加一)。同时,每个数的位置也表明了其意义,例如,对于十进制数字2019.08,其中的2表示的是2个千,而最后一个8则表示的是8个百分之一。

一般地,任意一个十进制数

D = d n d n -1 d 1 d 0 . d -1 d -2 d -m m n 为正整数)

其值可以表示为如下形式:

V D )= d n ×10 n + d n -1 ×10 n -1 +…+ d 1 ×10 1 + d 0 ×10 0 + d -1 ×10 -1 + d -2 ×10 -2 +…+ d -m ×10 -m

其中的 d i i = n n -1,…,1,0,-1,-2,…, -m )可以是0、1、2、3、4、5、6、7、8、9这10个数字符号中的任何一个,10称为基数(base),它代表每个数位上可以使用的不同数字符号的个数。10 i 称为第 i 位上的权。在用十进制数进行运算时,每位计满10就要向高位进一。

类似地,二进制数的基数是2,只使用两个不同的数字符号0和1,运算时采用“满二进一”的原则,即规定0+0=0、0+1=1、1+0=1、1+1=0并且需要进位。例如,对于一个二进制数(1011.01) 2 ,其对应的数值是1×2 3 +0×2 2 +1×2 1 +1×2 0 +0×2 -1 +1×2 -2 =11.25。

一般地,任意一个二进制数

B = b n b n -1 b 1 b 0 . b -1 b -2 b -m m n 为正整数)

其值可以表示为如下形式:

V B )= b n ×2 n + b n -1 ×2 n -1 +…+ b 1 ×2 1 + b 0 ×2 0 + b -1 ×2 -1 + b -2 ×2 -2 +…+ b -m ×2 -m

其中的 b i i = n n -1,…,1,0,-1,-2,…, -m )只能是0、1中的一个。

扩展到一般情况,在 R 进制数字系统中,需要有 R 个基本符号来表示各位上的数字,采用“满 R 进一”的运算规则,对于每一个数位 i ,该位上的权为 R i R 被称为该数字系统的基数。

任意一个 R 进制数

R ′= r n r n -1 r 1 r 0 . r -1 r -2 r -m m n 为正整数)

其值可以表示为如下形式:

V R ′)= r n × R n + r n -1 × R n -1 +…+ r 1 × R 1 + r 0 × R 0 + r -1 × R -1 + r -2 × R -2 +…+ r -m × R -m

其中的 r i i = n n -1,…,1,0,-1,-2,…, -m )只能是 R 个基本符号中的一个。

在计算机系统中的常用进位计数制有下列几种。

· 二进制 R =2,基本符号为0和1。

· 八进制 R =8,基本符号为0、1、2、3、4、5、6、7。

· 十进制 R =10,基本符号为0、1、2、3、4、5、6、7、8、9。

· 十六进制 R =16,基本符号为0、1、2、3、4、5、6、7、8、9、A或a、B或b、C或c、D或d、E或e、F或f。

表2-1列出了这4种进位计数制之间的对应关系。

表2-1 4种进位计数制之间的对应关系

从表2-1中可以看出,十六进制的前10个数字与十进制的前10个数字相同,十六进制的后6个基本符号A、B、C、D、E、F的值分别为十进制的10、11、12、13、14、15。

在书写时可以使用后缀字母标识该数的进位计数制。一般用B(Binary)表示二进制,用O(Octal)表示八进制,用D(Decimal)表示十进制(一般可以省略,即默认状态为十进制),用H(Hexadecimal)表示十六进制。

在编写代码时,其表示规则又有所不同。下面以C语言为例进行说明。

十进制数不需要任何说明,但要求数字部分只能是0~9,且不能以0开头。

八进制数由0~7八个数字组成,使用时必须以数字0开头。

十六进制由数字0~9、字母A~F或a~f(不区分大小写)组成,使用时必须以0x或0X(不区分大小写)开头。

二进制由数字0和1组成,使用时必须以0b或0B(不区分大小写)开头。

值得注意的是,标准C规范中对八进制、十进制与十六进制的表示方法进行了说明,而二进制的表示方法并不是标准C的规范,对某些编译器进行扩展才能够支持。例如:Visual C++6.0与Visual Studio 2010不支持,但Visual Studio 2015支持;GCC 3.4.5不支持,但GCC 4.8.2支持。

2.1.3 进制转换

在计算机内部,所有信息都采用二进制编码。但在计算机外部,为了书写和阅读的方便,大都采用八进制、十进制、十六进制表示形式,同时还有许多其他的进制,例如三进制(例如军队中一个排有三个班、一个连有三个排等)、六十进制(例如一分钟有60秒、一小时有60分钟)等,因此,必须实现这些进制之间的相互转换。

1. R 进制数转换成十进制数

任何一个 R 进制数转换成十进制数时,如前所述,只需要“按权展开”即可。例如,十六进制数转换为十进制数:

(F8C. B) 16 =F×16 2 +8×16+C×16 0 +B×16 -1

=15×16 2 +8×16+12×16 0 +10×16 -1

=3980.6875

二进制数转换为十进制数:

(110.01) 2 =1×2 2 +1×2+0×2 0 +0×2 -1 +1×2 -2

=6.25

2.十进制数转换成 R 进制数

在将十进制数转换成 R 进制数时,需要分别考虑整数和小数部分。

(1)整数部分

对于整数部分,采用的是除基取余法,即用目标数制的基数 R 去除十进制数,第一次相除所得余数为目的数的最低位,将所得商再除以基数 R ,反复执行上述过程,直到商为0,所得余数为目的数的最高位。

例:将十进制整数135分别转换成八进制数和七进制数。转换成八进制数的过程如下:

转换成七进制数的过程如下:

所以有:(135) 10 =(207) 8 =(252) 7

(2)小数部分

对于小数部分,采用“乘基取整”的方式,即将小数部分与基数 R 相乘,乘积的整数部分即为小数点后面第一个数位的值,乘积的小数部分继续与基数 R 相乘。以此类推,直到某一步乘积的小数部分为0或者数位已经到了指定的值。

例:将十进制小数0.6875转换成二进制小数。转换过程如下:

所以有(0.6875) 10 =(0.1011) 2

例:将十进制小数0.73转换成三进制小数,小数点后面保留4位值。转换过程如下:

所以有(0.73) 10 ≈(0.2021) 3

对于一个在表示范围内的整数而言,其在各个进制之间可以相互精确转换,因为在表示范围内的整数不管是哪种进制,都有唯一的表示。当范围扩展到实数域的时候,由于每个整数之间有无穷多个有理数,而每种进制下特定位数能精确表示的小数范围不一样,因此就会造成如上的精度损失问题。

3.二进制、八进制、十六进制数的相互转换

(1)八进制数转换成二进制数

八进制数转换成二进制数的方法很简单,只需要把每一个八进制数字改写成等值的3位二进制数即可,且保持高低位的次序不变。

八进制数字与二进制数字的对应关系如下:

(0) 8 =(000) 2 (1) 8 =(001) 2 (2) 8 =(010) 2 (3) 8 =(011) 2

(4) 8 =(100) 2 (5) 8 =(101) 2 ( 6) 8 =(110) 2 (7) 8 =(111) 2

例:将(1435.132) 8 转换成二进制数。

直接替换即可,有(1435.132) 8 =(001100011101.001011010) 2

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

十六进制数转换成二进制数的方法,与八进制数转换成二进制数的方法类似,即将每一个十六进制数字改写成等值的4位二进制数,且保持高低位的次序不变。

十六进制数字与二进制数字的对应关系如下:

(0) 16 =(0000) 2 (1) 16 =(0001) 2 (2) 16 =(0010) 2 (3) 16 =(0011) 2

(4) 16 =(0100) 2 (5) 16 =(0101) 2 (6) 16 =(0110) 2 (7) 16 =(0111) 2

(8) 16 =(1000) 2 (9) 16 =(1001) 2 (A) 16 =(1010) 2 (B) 16 =(1011) 2

(C) 16 =(1100) 2 (D) 16 =(1101) 2 (E) 16 =(1110) 2 (F) 16 =(1111) 2

例:将(3A. B) 16 转换成二进制数。

直接替换即可,有(3A. B) 16 =(00111010.1011) 2

(3)二进制数转换成八进制数

二进制数转换成八进制数时,整数部分从低位向高位方向每3位用一个等值的八进制数替换,最后不足3位时在高位补0凑满3位;小数部分从高位向低位方向每3位用一个等值八进制数来替换,最后不足3位时在低位补0凑满3位。

例如:

(0.10101) 2 =(000.101010) 2 =(0.52) 8

(10011.01) 2 =(010011.010) 2 =(23.2) 8

(4)二进制数转换成十六进制数

二进制数转换成十六进制数时,整数部分从低位向高位方向每4位用一个等值的十六进制数替换,最后不足4位时在高位补0凑满4位;小数部分从高位向低位方向每4位用一个等值十六进制数来替换,最后不足4位时在低位补0凑满4位。

例如:

(11001.11) 2 =(00011001.1100) 2 =(19.C) 16

从上面的描述可以看出,二进制数与八进制数、二进制数与十六进制数之间有很简单、直观的对应。八进制数与十六进制数虽然不能用计算机直接表示,但可以转换成二进制数,并且像十进制数一样简练,因此在平时开发和调试程序、查看机器代码时,都采用十六进制或八进制来显示,这样便于书写和阅读。 hzXR7NDI3irWfNhkuBRbXSynYrpLIxjvjlBqHyuZ6F7XFX42ISXCg6fncA7i2XFM

点击中间区域
呼出菜单
上一章
目录
下一章
×