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

原创 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()    {    ...
  • linxizi0622
  • linxizi0622
  • 2016年10月16日 15:03
  • 1575

移位与乘除法的关系

移位实现的乘除法 移位实现的乘除法比直接乘除的效率高很多。 用移位实现乘除法运算   a=a*4;   b=b/4;   可以改为:   a=a   b=b...
  • newbird105
  • newbird105
  • 2015年04月28日 10:39
  • 5893

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

问题的引出: int div16(int x){ int bias=(x>>31)&0xF; return (x+bias)>>4; } 问题就在于代码中的第二行,当x>=0时,bi...
  • Werewolf_Ace
  • Werewolf_Ace
  • 2015年11月19日 11:01
  • 846

C/C++用移位实现除法运算

例如:a = 3 * 16;b = 100 / 4; 3变为二进制:0000 0000 0000 0011,乘以16相当于左移4位,即16为2的4次幂。移位后为0000 0000 0011 0000...
  • yuxikuo_1
  • yuxikuo_1
  • 2014年12月09日 17:37
  • 969

负数的除法和右移的区别

A和B两个函数的结果是相同的,求M和N. #define M ? #define N ? int A(int x,int y) { int result = 0; result =...
  • xc889078
  • xc889078
  • 2013年05月14日 16:05
  • 1353

整型 右移 与 除法 的优化比较

如今网络上有一种呼声,说现在的编译器足够智能,会对代码自动地进行一些常见的优化,一些老的优化方法已经不再适用了,比如用右移代替除法运算、预计算等等。 很可惜,如今的C# 虽然具有一些编译优化的功能,...
  • hudaijun
  • hudaijun
  • 2011年11月18日 22:45
  • 2485

除法运算就是移位和相减

2进制完成除法运算就是移位和相减,比如1011011除以1110顺序如下:              1   -   1110   不够减,   结果添0,   1左移一位再加上原来1后的0,为10...
  • cenzmin
  • cenzmin
  • 2015年08月06日 09:54
  • 1398

移位实现乘除法

移位实现的乘除法   移位实现的乘除法比直接乘除的效率高很多。 用移位实现乘除法运算   a=a*4;   b=b/4;   可以改为:   a=a   ...
  • Tony_Wong
  • Tony_Wong
  • 2014年05月23日 10:08
  • 1270

C语言中乘除法与移位关系

本备忘参考博文点击打开链接 单片机编程中移位运算比乘除法效率更高,当然用移位运算替代乘除法代码会有点晦涩。下面记录下自己学习的内容以做备忘。 用移位实现乘除法运算  a=a*8;  b=b/8...
  • yehaibin
  • yehaibin
  • 2016年12月14日 14:37
  • 1638

误差error,偏置bias,方差variance的见解

不知怎么的,想到了这三个名词之间的关系,特地去查了一下,貌似学问还挺大。 以下纯属查阅资料,自己的理解,如有错误,谢谢下方评论纠正 ^_^ 主要参考资料:知乎上关于这三个名词的讨论,以及周志华的《机器...
  • zb1165048017
  • zb1165048017
  • 2016年08月18日 19:02
  • 3674
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:右移实现除法中的偏置量问题
举报原因:
原因补充:

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