右移实现除法中的偏置量问题

本文深入探讨了intdiv16函数的实现逻辑,特别关注了二进制右移操作如何帮助计算整数除法,并在负数情况下通过偏置量调整结果。解释了向下取整运算在不同数值范围内的表现,以及如何通过偏置量确保计算结果的准确性。

问题的引出:

int div16(int x){
    int bias=(x>>31)&0xF;
    return (x+bias)>>4;

}

问题就在于代码中的第二行,当x>=0时,bias值为零,当x<0时,bias值为15。如果把这行注释掉,对于正数的计算结果是没有问题的,但是对于负数的计算结果,就比理论值小1(例如当x=-17的时候,结果为-2)。原因如下:

在计算机中,如果两个int型数a和b作除法(a/b),当a不能被b整除的时候,表达式的结果为(a/b)的商。这个商是通过向下取整得来的。即对于17/16,结果在区间(1,2)上,向下取整,得到1。考虑a<0的情况,当a=-17时,结果在(-2,-1)上,向下取整,得到-2。而我们期望的结果是-1。通过与偏置量相加,将结果偏移到(-1,0)上,再向下取整,就得到-1。

当不能整除时,计算机都会采取向下取整运算。对于正数,向下取整是符合我们习惯的,对于负数,我们的期望时绝对值向下取整,即整体向上取整,这与计算机的向下取整不符合,所以就要通过偏置量来实现。

关于偏置量的取值,当a>=0时,偏置量值为0;当a<0时,设偏移量为n,偏置量取值为(2^n-1)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值