x的绝对值+y的绝对值≤1的图像(x的绝对值小于1怎么解)

求一个数的绝对值,不管是在数学领域,还是在计算机软件领域,都是常用的操作。求一个数的绝对值,算法很简单,也很容易理解,那么这么简单的算法,还有没有优化的空间呢?还真是有!这里介绍一种高效的求绝对值的算法,此算法在计算机的执行效率上要比常规算法快一些。

1、常规算法

那么什么是绝对值?如何求绝对值?相信上过中学的人都知道,一个数的绝对值:如果这个数大于等于零,则其绝对值是其本身,如果这个数小于零,则其绝对值是其本身取负。求绝对值的数学公式如下:

x的绝对值+y的绝对值≤1的图像(x的绝对值小于1怎么解)

图1 绝对值公式

这个公式是不是很简单?很简单!编程实现这个公式的代码也很简单,以下用C语言编写常规的绝对值公式:

int abs(int x)
{
  if(x>=0)return x;
  else return -x;
}

先分析一下段代码所需要的指令数量:x与0比较,if跳转,乘以-1,最多三条指令就可以了。这样简单的代码还有优化的空间吗?当然有!在现代CPU采用流水线式指令执行模式下,影响程序运行速度的,不仅仅是指令的数量,还有分支的数量,其中if分支因为会中断流水线,所以其对程序执行的效率影响很大。一个优质的代码,应该尽可能避免过多地使用分支结构(if-else)。

2、高效算法

常规绝对值算法因为存在分支结构,所以其执行效率不高。下面介绍几种绝对值算法,通常用三、四条指令就能实现,而且不含分支结构。例如求整型数x的绝对值:

首先,求出一个中间变量:

x的绝对值+y的绝对值≤1的图像(x的绝对值小于1怎么解)

图2 中间变量

然后,套用以下任意一条式子,就可以求出绝对值。

x的绝对值+y的绝对值≤1的图像(x的绝对值小于1怎么解)

图3 高效求绝对值

以上式子中:

x的绝对值+y的绝对值≤1的图像(x的绝对值小于1怎么解)

图4 符号的含义

C语言代码实现如下:

int abs(x)
{
  int y=x>>31;
  return (x^y)-y;
}

为了能够获得极致的运行效率,可以使用汇编代码,实现该算法。如果你使用的是微软的VS集成开发环境,那么在C代码中内嵌汇编代码,就相当方便了。这里使用内嵌汇编的形式,编写该算法的代码:

int abs(int x)
{
    int y;
    __asm
  {
    mov eax,x
    mov ebx,eax
    shr eax,31
    xor ebx,eax
    sub ebx,eax
    mov y,ebx
  }
  return y;
}
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 sumchina520@foxmail.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.sumedu.com/faq/42238.html