通过右移2的幂次实现被除数为负数的除法

在阅读CSAPP的时候,看了练习题3.20的答案,说到被除数为负数的时候需要加偏置。

WHY?

总结了一下CSAPP中的解释(书P73)
计算机实现除法的时候,需要的时钟周期很长,所以当除数为2的幂次的时候,就可以使用算术右移来实现除法。

  1. 被除数非负的情况

    整数的除法总是舍入到零的,比如2.3舍入到2, -1.5舍入到-1。
    当被除数为正数的时候,算术右移来执行除法,结果自然是向零舍入的。(因为直接把后面右移的数字舍弃了)
    正数样例

  2. 被除数负数的情况

    但是当被除数是负数的时候,会出现向下舍入,比如-1.5会被舍入为-2。
    负数样例
    为了解决这个问题,我们需要先对被除数加上一个偏置数。当除数为2的k次幂的时候,偏置量为2^k - 1
    负数样例
    这样就可以解决被除数为负数的舍入问题。
    以下为CSAPP中的推导
    推导

    个人简单理解

    假设除数为2的k次幂,代表我们要右移k位,当这k位都为0的时候,代表不需要舍入,能够整除,但是当k位有任何一位为1的时候,代表不能整除,需要做舍入处理。如果不加偏置,就代表我们要直接舍弃最低的k位,对不需要右移的最低位毫无影响,那么对于负数来说。如果加上偏置,那么需要舍入的时候,对于第k+1位,会有一个来自低位的进位,这个时候数值自然就会向0舍入。

通过右移2的幂次实现被除数为负数的除法

http://example.com/2021/07/19/通过右移2的幂次实现除法/

作者

xiaomaotou31

发布于

2021-07-19

更新于

2021-07-20

许可协议

评论