不使用逻辑运算求得两数的最大值

系统 1961 0
下面将介绍两个不使用逻辑运算求两数最大值的算法:
 
算法一
 

int   max ( const   int   * p ,   const   int   * q )

{

    int  array [ ]   =   { * p ,   * q } ;

    return  array [ ( unsigned ) ( * -   * q )   > >   ( sizeof ( int )   *  8  -  1 ) ] ;

}

算法二

int   max ( const   int   * p ,   const   int   * q )

{

    return   ( ( ( * +   * q )   +   abs ( * -   * q ) )   /  2 ) ;

}

分析:

算法一利用计算机系统中数的存储方式为其补码这一特性。补码的最高位为符号位,如果为正,则最高位为0,反之则为1。通过右移运算得到其最高位的值。之所以转换为无符号数是因为无符号数右移时左边高位移入0,而对于有符号数,当原来符号位为0(该数为正)时左边也是移入0,但如果符号位为1,时左边移入0还是1则不确定,取决于所用的计算机系统。

当*p大于*q时,右移后得0,则函数返回数组中下标为0的元素,即*p;反之则*q。

缺点:如果*p与*q之差大于等于2^31,则算法出错。

算法二则利用<math.h>中的函数abs()。

如果a大于b,则

abs(a - b) = a - b

(a + b + abs(a - b)) / 2 = (a + b + a - b) / 2 = a

如果a小于b,则

abs(a - b) = b - a

(a + b + (abs(a - b)) /2 = (a + b + b - a) / 2 = b

缺点:要调用库函数。(a + b + abs(a - b))使a, b中的最大值的绝对值要小于2^30,否则可能会溢出(考虑有符号数的表示范围为-2^31~2^31-1)。

注:C99符加的标准ANSI C库中abs()包含在 中。

不使用逻辑运算求得两数的最大值


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论