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

原创 2015年11月19日 11:01:16

问题的引出:

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)。


相关文章推荐

除法和算术右移之间的巧妙取代

在大多数机器上,整数 的除法很慢,需要30多个时钟周期,除以2的幂也可以用移位运算来实现     先码上代码     #include "stdio.h"    int main()    {    ...

移位与乘除法的关系

移位实现的乘除法 移位实现的乘除法比直接乘除的效率高很多。 用移位实现乘除法运算   a=a*4;   b=b/4;   可以改为:   a=a   b=b...

标注偏置问题(Label Bias Problem)和HMM、MEMM、CRF模型比较

出处:http://blog.csdn.net/zhoubl668/article/details/7787690 路径1-1-1-1的概率:0.4*0.45*0.5=0.09 ...
  • lskyne
  • lskyne
  • 2013年03月13日 16:55
  • 6442

AD5933的直流偏置和量程自动切换问题

最近在使用STM32+AD5933设计阻抗测量系统,不考虑AD5933输出阻抗和直流分量对阻抗测量带来的影响,按照AD5933datasheet上的简单电路将AD5933和STM32单片机进行了连接,...

标注偏置问题(Label Bias Problem)和HMM、MEMM、CRF模型比较

路径1-1-1-1的概率:0.4*0.45*0.5=0.09 路径2-2-2-2的概率:0.018 路径1-2-1-2:0.06 路径1-1-2-2:0.066 由此可得最优路径为...

编程题目:PAT 1008. 数组元素循环右移问题 (20)

1008. 数组元素循环右移问题 (20) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 8000 B ...

00-自测3. 数组元素循环右移问题 (20)

题目链接:http://www.patest.cn/contests/mooc-ds/00-%E8%87%AA%E6%B5%8B3 00-自测3. 数组元素循环右移问题 (20) ...

1008. 数组元素循环右移问题 (20)

一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:右移实现除法中的偏置量问题
举报原因:
原因补充:

(最多只允许输入30个字)