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

【摘要】 本节书摘来自华章计算机《计算机组成与体系结构(原书第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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值