求绝对值的方法汇总
2015-11-28 14:37
204 查看
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; }
相关文章推荐
- 在布局文件里添加toolbar时出现的错误error: Error parsing XML: unbound prefix
- 一键退出
- Flume NG 配置详解
- dede标签调用
- 文法与语言分类
- 九度奥运排序问题,本周博客系统开发遇到一些问题的解决
- 关于开机动画的问题
- Xcode 快捷键
- octave 之 legend用法
- 商品详情的显示
- 一段新的旅程
- 169 Identify the channel settings that can be performed using the CONFIGURE CHANNEL or ALLOCATE CHAN
- 水平ListView
- 【USACO 5.1.3】Musical Themes
- OpenMP并行加速笛卡尔乘积
- 【在开发部的日子】菜鸟Ku
- C语言字节对齐详解
- Java 字符串全面解析
- OpenMP并行加速笛卡尔乘积
- IT行业(程序员)常用英文【单词本】