文章插图
求一个数的绝对值,不管是在数学领域,还是在计算机软件领域,都是常用的操作 。求一个数的绝对值,算法很简单,也很容易理解,那么这么简单的算法,还有没有优化的空间呢?还真是有!这里介绍一种高效的求绝对值的算法,此算法在计算机的执行效率上要比常规算法快一些 。
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的绝对值:
首先,求出一个中间变量:
图2 中间变量
然后,套用以下任意一条式子,就可以求出绝对值 。
图3 高效求绝对值
以上式子中:
图4 符号的含义
C语言代码实现如下:
int abs(x){int y=x>>31;return (x^y)-y;}
为了能够获得极致的运行效率,可以使用汇编代码,实现该算法 。如果你使用的是微软的VS集成开发环境,那么在C代码中内嵌汇编代码,就相当方便了 。这里使用内嵌汇编的形式,编写该算法的代码:
int abs(int x){int y;__asm{mov eax,xmov ebx,eaxshr eax,31xor ebx,eaxsub ebx,eaxmov y,ebx}return y;}
【一种高效的绝对值算法 绝对值巧妙算法】
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- Excel自动填充学号的便捷方法
- 解决OBS直播没有声音的问题
- 手把手教你做超好吃的甲鱼汤 甲鱼汤怎么做好喝又营养
- 制作金箔文字和边框效果的Word封面
- 如何打造一个整洁有序的电脑桌面
- 不是钱的事 淄博烧烤店停业三天 老板:保命要紧
- 如何在WORD文档中插入多行多列的表格
- 手机内屏与外屏的区别
- 水煮肉片的做法 水煮肉片的家常做法
- 新解决Windows 10中javac未识别为内部或外部命令的方法