《计算机组成与体系结构(原书第4版)》 —2.4.7 使用移位进行二进制乘法和除法

举报
华章计算机 发表于 2019/11/19 15:51:16 2019/11/19
【摘要】 本节书摘来自华章计算机《计算机组成与体系结构(原书第4版)》一书中第2章,第2.4.7节,作者是[美] 琳达·纳尔(Linda Null)朱莉娅·洛博(Julia Lobur)宾夕法尼亚州立大学,张 钢 魏继增 李雪威天津大学 李春阁 何 颖天津大学仁爱学院 译。

2.4.7 使用移位进行二进制乘法和除法

移位一个二进制数意味着左移或右移一定的位数。例如,二进制数值00001111向左移一位得到的结果是00011110(如果我们在右边填上一个零)。第一个数是十进制值15,第二个是十进制30,这恰好是第一个数的两倍。这不是巧合!

当使用有符号数的2的补码时,可以使用一个名为算术移位的特殊类型的移位,以快速且容易地执行乘以2和除以2的操作。回想在2的补码中,最左边的位决定它的符号,所以必须小心移动这些值,我们不能改变符号位,当乘以2或除以2时不应该改变该数的符号。

我们可以执行算术左移(将数字乘以2)或算术右移(将数字除以2)。假设位的编号是从右到左并从0开始编号,有以下对算术左右移位的定义。

算术左移插入一个0到b0位,并将所有其他位向左移一个位置,使得bn-1位被bn-2位替代。bn-1位是符号位,如果该位的值发生改变,则会引起操作溢出。在二进制数中,乘以2总是使得最右一位等于0,这是一个偶数,因此解释了为什么用一个零填充最右边。思考以下示例:

例2.28计算11(使用8位有符号数的2的补码表示)乘以2的结果。

我们从计算11的二进制值开始:

0 0 0 0 1 0 1 1

左移一位,结果是:

0 0 0 1 0  1 1 0

这是十进制22=11×2。没有溢出发生,所以这个值正确。

例2.29计算12(使用8位有符号数的2的补码表示)乘以4的结果。

我们从计算12的二进制值开始:

0 0 0 0 1 1 0 0

左移两位(每次移位相当于乘以2,所以两次移位等于乘以4),结果是:

0 0 1 1  0 0 0 0

这是十进制的48=12×4。没有溢出发生,所以这个值正确。

例2.30计算66(使用8位有符号数的2的补码表示)乘以2的结果。

我们从计算66的二进制值开始:

0 1 0 0 0 0  1 0

左移一位,结果是:

1 0 0 0 0  1 0 0

但是符号位已经改变了,所以发生了溢出(66×2=132,这个数太大,不能使用8位有符号数的2的补码表示)。

算术右移是将所有位向右移动,但复制符号位从bn-1位到bn-2位。因为我们从右到左复制符号位,所以溢出不是一个问题。然而,除以2可能有一个余数1;使用这种方法的除法运算是严格的整数除法,所以在任何情况下余数都不能被存储。思考以下示例:

例2.31计算12(使用8位有符号数的2的补码表示)除以2的结果。

我们从计算12的二进制值开始:

0 0 0 0  1 1 0 0

右移一位,复制符号位0,结果是:

0 0 0 0 0  1 1 0

这是十进制的6=12÷2。

例2.32计算12(使用8位有符号数的2的补码表示)除以4的结果。

我们从计算12的二进制值开始:

0 0 0 0 1 1 0 0

右移两位,结果是:

0 0 0 0  0 0 1 1

这是十进制的3=12÷4。

例2.33计算-14(使用8位有符号数的2的补码表示)除以2的结果。

我们从计算-14的2的补码表示开始:

1 1 1 1 0 0 1 0

右移一位(带符号位),结果是:

1 1 1 1 1 0 0 1

这是十进制的-7=-14÷2。

注意,如果我们将-15除以2(见例2.33),结果是将是11110001向左移动一位得到11111000,这是-8。因为我们做的是整数除法,所以-15除以2确实等于-8。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。