求绝对值的方法汇总


void fnTestAbs()
{
    /** abs库函数的调试版
    int __cdecl abs (
    int number
    )
    {
    return( number>=0 ? number : -number );
    }
    */

    int iA = -789;
    int iB = 789;

    float fA = -789;
    float fB = 789;

    /// 调用库函数实现
    fA = fabsf(fA); ///< M$真抠门, 到 fabs 已经没有源码实现了
    fB = fabsf(fB);

    iA = abs(iA);
    iB = abs(iB);

    /// 用短路表达式, 实现形式上的无分支
    iA = -789;
    iB = 789;
    iA = absEx1(iA);
    iB = absEx1(iB);

    /// 1. 真正的无分支方法实现abs
    iA = -789;
    iB = 789;
    iA = absEx2(iA);
    iB = absEx2(iB);

    /// 2. 真正的无分支方法实现abs
    iA = -789;
    iB = 789;
    iA = absEx3(iA);
    iB = absEx3(iB);
}

int absEx1(int iIn)
{
    (iIn < 0) && (iIn = -iIn);
    return iIn;
}

int absEx2(int iIn)
{
    /// 得到符号位为原始符号代表的值 * 原值
    /// 如果符号位为-, 得到-1(0xFFFFFFFF) | 1 = -1
    /// 如果符号位为+, 得到0(0x00000000) | 1 = 1
    return ((iIn >> 31) | 1) * iIn;
}

int absEx3(int iIn)
{
    int m = iIn >> 31;
    /// 得到符号位组成的int值
    /// if (iIn > 0), m = 0;
    /// if (iIn < 0), m =  0xffffffff;

    iIn = iIn ^ m; ///< 取反
    /// if (iIn > 0), iIn = iIn ^ 0 = iIn; 不变
    /// if (iIn < 0), iIn = iIn ^ 0xffffffff = ~iIn;

    iIn = iIn - m; ///< 加1
    /// if (iIn > 0), iIn = iIn - 0 = iIn;
    /// if (iIn < 0), iIn = iIn - 0xffffffff = iIn - (-1) = iIn + 1;
    /// 负数取反+1, 变成了正数

    return iIn;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值