通过右移2的幂次实现被除数为负数的除法
在阅读CSAPP的时候,看了练习题3.20的答案,说到被除数为负数的时候需要加偏置。
WHY?
总结了一下CSAPP中的解释(书P73)
计算机实现除法的时候,需要的时钟周期很长,所以当除数为2的幂次的时候,就可以使用算术右移来实现除法。
被除数非负的情况
整数的除法总是舍入到零的,比如2.3舍入到2, -1.5舍入到-1。
当被除数为正数的时候,算术右移来执行除法,结果自然是向零舍入的。(因为直接把后面右移的数字舍弃了)
被除数负数的情况
但是当被除数是负数的时候,会出现向下舍入,比如-1.5会被舍入为-2。
为了解决这个问题,我们需要先对被除数加上一个偏置数。当除数为2的k次幂的时候,偏置量为2^k - 1
这样就可以解决被除数为负数的舍入问题。
以下为CSAPP中的推导
个人简单理解
假设除数为2的k次幂,代表我们要右移k位,当这k位都为0的时候,代表不需要舍入,能够整除,但是当k位有任何一位为1的时候,代表不能整除,需要做舍入处理。如果不加偏置,就代表我们要直接舍弃最低的k位,对不需要右移的最低位毫无影响,那么对于负数来说。如果加上偏置,那么需要舍入的时候,对于第k+1位,会有一个来自低位的进位,这个时候数值自然就会向0舍入。
通过右移2的幂次实现被除数为负数的除法