• 沒有找到結果。

本节所介绍的二进数运算主要包括无符号二进制数四则算术运算、机器数补码形式的加/ 

减法运算和无符号二进制数的逻辑运算。比较复杂的浮点数运算将在本章后面介绍。其实无符 号二进制数的算术和逻辑运算方法同样适用于补码形式二进制数、浮点数中真值部分二进制数 的对应运算。

【说明】通过前面的学习我们已经知道,因为补码形式的二进制数符号位也是直接参与运算 的,不需要单独处理,所以在计算机中都是以补码形式来进行二进制数运算的。也正因为如此,在 进行各种二进制运算时都建议把对应的二进制数转换为补码形式。

1.6.1 二进制数的算术运算

无符号二进制数的加、减、乘、除四则算术运算法则其实与十进制数的四则算术运算法则是 一一对应的。你理解了十进制数的四则算术运算法则,无符号二进制数的四则算术运算就一点都 不难了。 

1.加法运算

加法运算法则:0+0=0,0+1=1,1+0=1,1+1=10。

即当两个相加的二进制位仅一位为 1 时,相加的结果为 1;如果两个二进制位全是 0,相加的 结果仍为 0;如果两个相加的二进制位均为 1,则结果为 10(相当于十进制中的 2),要向高位进 1,

也就是“逢 2 进 1”规则,与十进制中的“逢 10 进 1”道理一样。

1 Chapter

【说明】在进行二进制加减法运算时,最关键的一点就是逢 2 进 1,进 1 当 1,而借 1 当 2。

大家联想一下我们经常使用的十进制数加法运算法则,那就是逢 10 进 1,进 1 当 1,而借 1 当 10,

这样一来我们就好理解了, 无符号二进制数的加法运算法则只是把原来十进制数加法运算法则中的  10 改成了 2。

【示例 1】计算(10010)2+(11010)的过程如图 1­17 所示(注意两数要从最低位开始对齐)。

图 1­17  二进制加法运算示例

(1)进行最低位相加,这里加数和被加数都为“0” ,根据加法原则可以知道,相加后为“0” 。

(2)进行倒数第二位相加,这里加数和被加数都为“1” ,根据加法原则可以知道,相加后为

“(10)2” ,此时把后面的“0”留下,而把第一位的“1”向高一位进“1” 。

(3)进行倒数第三位相加,这里加数和被加数都为“0” ,根据加法原则可以知道,本来结果 应为“0” ,但倒数第二位已向这位进“1”了,此时就要同时把“被加数”“加数”和“进位”这三 个数加起来,所以结果应为 0+0+1=1。

(4)进行倒数第四位相加,这里加数和被加数分别为“1”和“0” ,倒数第三位也没有进位,

根据加法原则可以知道,相加后为“1” 。

(5)最高位相加,这里加数和被加数都为“1” ,根据加法原则可以知道,相加后为“(10)2” 。 同样需要把第一位的“0”留下并向高位进  1,这样会产生新的最高位,值为“1” (但如果超出了 字长的限制,则新产生的最高位将溢出)。

这样(10010)+(11010)的最后运算结果为 101100。 

2.减法运算法则

减法运算法则:1­1=0,1­0=1,0­0=0,0­1=­1。

即当两个相减的二进制位中同为 0 或 1 时,相减的结果为 0;如果被减数的二进制位为 1,而 减数的二进制位为 0,则相减的结果仍为 1;如果被减数的二进制位为 0,而减数的二进制位为 1,

则需要向高位借 1,但此时是借 1 当 2,与十进制中的借 1 当 10 道理一样。

【示例 2】计算(111010)2­(101011)的过程如图 1­18 所示(注意两数要从最低位开始对齐)。

(1)最低位相减,这里被减数为“0” ,减数为“1” ,不能直接相减,需要向高位(此时为倒 数第二位)借“1” ,这样相当于得到了十进制中的“2” ,用 2 减 1 结果就得到 1。

(2)对倒数第二位相减,此时本来被减数和减数均为“1” ,但是被减数的该位被上一步借走 了  1,所以最后就变为“0” (1­1)了。此时也不能直接与减数相减了,又需要向高位(此时为倒

1 Chapter

数第三位) 借 1。 同样是借 1 当 2, 相当于该位总共为 0+2=2。 这样倒数第二位相减后的结果为 2­1=1。

图 1­18  二进制减法运算示例

(3)用上一步同样的方法计算倒数第三位和倒数第四位的减法运算,结果都为 1。

(4)计算倒数第五位的减法运算,此时被减数原来为“1” ,可是已被倒数第四位借走了  1,

所以成了“0” (1­1),而此时减数也为“0” ,可以直接相减,得到的结果为“0” 。

(5)计算最高位的相减,被减数和减数均为“1” ,可以直接相减,得到的结果为“0” 。 这样一来,(111010)2­(101011)的结果是(001111)2,由于整数的前导 0 可以不写,所以最后结 果就是(1111)2。 

3.乘法运算法则

乘法运算法则:0×0=0,0×1=0,1×0=0,1×1=1。

即只有当两个相乘的二进制数都为 1 时,相乘的结果才为 1;两个相乘的二进制数中只要有一 位为 0(也包括是两位同时为 0),则相乘的结果都为 0。也可以这么理解:1 与任何数相乘的结果 就是对应的被乘数;而 0 与任何数相乘的结果都为 0。这与十进制中的乘法运算法则也是一样的。

【说明】在乘法运算中,乘数的每一位要与被乘数的每一位分别相乘,而不仅是对应位相乘,

而且每一位乘数与被乘数的每一位相乘的结果的最低位要与对应的被乘数位一样。 当然这与十进制 的乘法运算法则也是一样的,很好理解。

【示例 3】计算(1010)2×(101)的过程如图 1­19 所示(注意两数要从最低位开始对齐)。

图 1­19  二进制乘法运算示例

(1)乘数的最低位与被乘数的所有位相乘,因为乘数的最低位为“1” ,根据乘法原则可以得 这里被减数和减数一定要从

最低位开始一位位地对齐

这里每行的最低位一定 要与对应的乘数位对齐

1 Chapter

出,结果其实就是被乘数本身,直接复制下来即可。此处结果就为 1010。

(2)乘数的倒数第二位与被乘数的所有位相乘,因为乘数的这一位为“0” ,根据乘法运算法 则可以得出,结果均为“0” 。此处结果就为 0000。

(3)乘数的最高位与被乘数的所有位相乘,此时乘数为“1” ,结果就是被乘数本身。此处结 果就为 1010。

(4)按照前面介绍的二进制加法原则对以上三步所得的结果按位相加(但这里的位对齐方式 与单纯的二进制数相加不一样,最低位一定要与对应被乘数位一致。这也与十进制的乘法运算方法 一样),结果得到(110010)2。 

4.除法运算法则

当被除数大于除数时,商是“1” ;当被除数小于除数时,不够除,商只能是“0” ,这与十进制 的除法也类似。二进制只有两个数(0 和 1),因此它的商也只能是 1 或 0。

【示例 4】计算(11001)2÷(101)的过程如图 1­20 所示。

图 1­20  二进制除法运算示例

(1)因为除数为“101” ,有 3 位,所以在被除数中也至少要取 3 位(从最高位开始取)。被除 数的高 3 位为“110” ,恰好比除数“101”大,可以直接相除,但商只能是 1(因为二进制的最大 数元就是 1),然后把被除数与用商“1”与除数相乘后的结果进行相减,得到的值为“1” 。

(2)从被除数中取下一位“0”下来,与上一步的差“1”值组成新的被除数,为“10” ,显然 它比除数“101”小,不够除。于是在商的对应位置上输入“0” 。

(3) 继续从被除数中取下一位 “1”下来,与上一步的余数“10”值组成新的被除数,为 “101” , 此数正好与除数“101”相等,所以此时的商取“1”正好除尽。

这样一来(11001)2÷(101)所得的商就是(101)2。 1.6.2 补码的加/减法运算

通过前面的学习我们已经知道,机器数的补码可由原码和反码得到。如果机器数是正数,则该 机器数的补码与原码、反码一样;如果机器数是负数,则该机器数的补码是对它的反码在末位加 1  而得到的。 

1.补码的加法运算

补码的加法运算法则:[X+Y]= [X]+[Y]

1 Chapter

该式表明,两个机器数相加的补码可以通过先分别对两个机器数求补码,然后相加得到。在采 用补码形式表示时,进行加法运算可以把符号位和数值位一起进行运算(若符号位有进位,则溢出 不管),结果为两数之和的补码形式。

【示例 1】如要求两个十进制数:35+18 的补码(假设字长为 8)。根据上面的补码加法运算法 则可以得知,只需分别求 35 和 18 这两个数的补码,然后相加即可。又因为这两个数都是正数,所 以它们的补码与原码一样。

这样一来,这道题实际上也就是求 35 和 18 这两个十进制数的原码和。35 的原码为 0 0100011 

(注意:最高位为符号位),18  的补码为  0  0010010。所以  35+18  的补码就等于(0  0100011)B+(0  0010010)B=(00110101)B,如图  1­21(a)所示。如果转换成十进制则等于  53,结果正确。如果相 加后有超过字长的位溢出,则直接丢弃。

【示例 2】 如果要求两个十进制数: 35+(­18)和的补码也是直接求正数 35 和负数(­18)的补码和。

正数 35 的补码与其原码一样,前面已计算出,为 0  0100011;而后面那个“­18”因为是负数,不 能直接从它的原码得到补码了。需要先就要求(­18)的原码(1  0010010),然后对其除符号位外 的其他各位取反,得到其反码(为 1 1101101),最后再在其末位(最低位)加 1,最终得到其补码 为 1 1101110。

这样一来, “35­18”的补码就是(00100011)B+(11101110)B,结果为 00010001,如图 1­21(b)

所示。这里要注意,两个补码相加后产生了第  9  位(为  1)的溢出,直接丢弃,所以结果就是  (00010001)B。如果转换成十进制则等于 17,结果正确。

(a) (b)

图 1­21  两个补码加法运算示例  2.补码的减法运算

补码的减法运算法则:[X­Y]=[X]+[­Y]

该公式表明,求两个机器数的差值(如[X­Y])的补码可以通过求被减数的补码(如[X])与 减数的负值的补码([­Y])的和得到。

负数补码的求解方法我们在前面已有介绍, 那就是先对除符位号外的其他各位取反, 最后加 1。

其实还有一个更简单的方法,那就是负数的补码等于该正数的补码(也等于该正数的原码)全部位

(含符号位)取反,然后再加 1(因为正数与负数的符号也正好相反)。如已知[15]=00001111,则  [­15]=11110000+1=11110001。

1 Chapter

【示例 3】现假设 X=+35,Y=+18,要求[X­Y](假设字长为 8)。

先根据正数的补码与原码一样的规则,求得[X]= 00100011,[Y]补  = 00010010;再根据以上介 绍的负数求补码操作规则(全部位取反,再加 1),可以得到[­Y]=11101110。

最后用[X]+[­Y]公式即可得到最终的[X­Y]补  = 00010001,如图 1­22(a)所示。转换成十进 制也可得到结果为  17,正确,且与上面使用加法法则运算的结果一样。注意,这里相加的结果也 产生了溢出的第 9 位(1),直接丢弃。

【示例 4】如有两个十进制数 X=­35,Y=­18,现要求[X+Y]的值。

根据前面介绍的加法法则得知,可先求得[X]和[Y]的值,然后再相加,即[X]+[Y]。根据 本章前面介绍的求负数补码的方法来计算­35 和­18 的补码。

上一示例中已求出了 35 和 18 的补码(也就是它们的原码)分别为 00100011 和 00010010,然 后分别对它们各位取反,再加 1,由此可得出[­35]为 1 1011101,[­18]=11101110。

上一示例中已求出了 35 和 18 的补码(也就是它们的原码)分别为 00100011 和 00010010,然 后分别对它们各位取反,再加 1,由此可得出[­35]为 1 1011101,[­18]=11101110。

相關文件