《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算

1.4 算术运算

r进制的算术运算方法和十进制类似。但是,在r进制的情况下,要特别注意只有r个基本数字可用,而且所有的计算是逢r进1。下面是两个二进制数的加法计算例子(注意做加法运算的操作数的名称):
《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算

除了每位的和只可能是0和1以外,二进制的加法和十进制的加法规则一样。当然,在二进制加法中,当某位的和大于1时就会产生进位(而在十进制中,只有当和大于9才会产生进位),进位都会加入到临近的高位。在第一个例子中,因为所有的进位都为0,所以和就相当于被加数与加数的各位简单相加。在第二个例子中,从右数第2列的两位的和是2,会向高位产生一个进位,而本位为0(2=2+0)。此进位参与第3位的加法运算,这样第3位的和则为3,同样要向高位产生一个进位,而本位则为1(3=2+1)。
下面是两个二进制数的减法运算过程(同样,注意操作数的名称):
《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算

二进制减法运算规则也和十进制一样,除了被减数某位向高位的借位相当于在本位加2(而十进制中一个借位相当于在本位加10)。在第一个例子中,没有任何借位发生,所以差只是被减数与减数按位简单相减。在第二个例子中,在最右列,由于被减数的该位是0,而减数的该位为1,所以必须向第2位借位,这样第一位的差就是1(2+0―1=1)。在第2位,由于它已被借位,值为0,而减数的第2位为1,所以它还须向第3位借位。如果被减数小于减数,我们就将减数减去被减数,在差的前面加上一个负号。第三个例子说明的就是这种情况,注意减数和被减数的位置被调换了。
最后要演示的是二进制的乘法计算,同样很简单。在二进制乘法中,乘数的数字非0即1。这样,部分乘积就是0或被乘数。下面是乘法的例子:
《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算

八进制、十六进制以及其他r进制数的算术运算都需要查询对应进制中位与位相加或相乘的结果对应表。一种更简单的办法是将r进制数中一列对应的位转换为十进制数,按十进制规则进行计算,这样我们就可以很方便地使用我们经常习惯使用的十进制计算表,计算完后,再将和以及进位转换回r进制。例1-2是用这种方法计算两个十六进制数59F与E46之和的步骤。
例1-2 十六进制数加法
计算(59F)16+(E46)16:
《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算

在例子右边等价的十进制的计算过程中,必须运用推理得出对应十六进制中的每一位。例如,在计算右边第一列的F+6时,我们转换成等价的十进制计算15+6=21,然后在转换回十六进制时,我们注意到21=16+5,所以,本位的结果为5,并向高位进1。其他两列的计算方法相同。 ■
总的来说,做两个r进制数的乘法计算时,每一步可以采用十进制的规则进行计算,同时将每一步的中间结果转换为r进制数。例1-3演示的是两个八进制数的乘法。
例1-3 八进制乘法
计算(762)8×(45)8:
《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算

上图右边演示的是每一对八进制位的心算过程。八进制的0~7的数字和十进制中相对应的数字是一样的。每一对八进制数位的相乘以及加上低位的进位,都可以按十进制的计算方法进行,然后再将这一步的结果转换回八进制,如果结果是两位的八进制数,则高位就是本列的进位,低位就是本列的计算结果。例如,(5×2)8=(12)8,结果中的高位1作为进位加入(5×6)8的计算结果,低位的2就是本列的八进制计算结果。乘数最高位的进位可直接作为乘积中下一位的结果,比如46中的4。 ■
十进制数转换为其他进制数
之前我们采用多项式展开的方法将其他进制的数转换为十进制数。现在我们采用一种通用的过程将十进制数转换为r进制数。如果待转换的数中有小数点,我们要将这个数分成整数部分与小数部分,两个部分的转换要分别进行。通过采用短除法可以将十进制整数转换成r进制数,步骤就是不断用r除要转换的十进制数以及每步产生的商,直至最后的商等于0,每一步所得到的余数就可构成所要转换的结果,其过程可以用例1-4具体说明。
例1-4 十进制整数转换为八进制数
将十进制数153转换为八进制数:
基底为8。首先,用8除153,商为19,余数为1。然后,继续用8除19,商为2,余数为3。最后,用8除2,商为0,余数为2。每一步的余数就可构成我们想要得到的八进制数的位。
《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算

注意,在例1-4中,余数从最后到第一,按逆序构成转换数的高位到低位,如箭头所指。商不断地被r除直到为0。同样,可以采用这种方法,将十进制数转换为二进制数,如例1-5所示。在这个例子当中,r是2,所以短除法中的除数是2。
例1-5 十进制整数转换为二进制数
转换十进制数41为二进制数:
《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算

当然,反过来,将二进制数按2的指数多项式展开求和就能得到对应的十进制数。

            (41)10=32+8+1=(101001)2                 ■

将十进制小数转换为r进制形式的方法和整数的转换方法有所不同,称为“连乘法”,也就是不断地用r乘以要转换的十进制小数,每次相乘得到的结果的整数部分构成转换结果的对应的位。这种方法可以用例1-6说明。
例1-6 十进制小数转换为二进制形式
将十进制小数0.6875转换为二进制数:
首先,将0.6875乘以2,结果中有整数与小数,再将新的小数与2相乘,又得到新的整数与小数,这样不断继续,直到小数部分为0或满足精确要求为止。二进制数中的位就由每步得到的整数部分构成,方法如下:
《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算

注意例子中每步得到的整数按箭头方向排列即可得到转换后的结果。在这个例子中,转换后的小数是有限的,但有时不断连乘并不能使小数部分变为0,这时必须决定需要多少位小数才能满足精确度的要求。由于转换的方法是用r进行连乘,那么将十进制小数转换为八进制形式,就得用8来连乘,如例1-7所示。
例1-7 十进制小数转换为八进制形式
将十进制小数0.513转换为小数位为3位的八进制形式:
《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算

转换结果中的3位数由每步的整数来构成,我们连乘4次,得到4个整数,注意到最低的一位整数为5,在八进制中按取整法(即类似十进制中的四舍五入),向次低位6进一位,这样就得到:

                (0.513)10=(0.407)8                  ■

如果待转换的数中既有整数部分又有小数部分,就可以将两部分分别转换,最后组合形成结果。比如,采用例1-4和例1-7的结果,我们可以得到:
(153.513)10=(231.407)8

上一篇:IBM郭继军:机器学习配合行业经验将帮助企业成就未来


下一篇:Python零基础学习代码实践 —— 提取字符串里面的单词数