x264_median 函数分析
2012-12-08 23:21
288 查看
先上代码:
该函数实现的功能其实看函数名就能够知道了,就是求a,b,c三个整型值的中位数。但是呢,函数的实现确并非令人一目了然,需要仔细分析计算才能够看明白这里面到底为什么就能够求出这三个整型值的中位数,一个我们预期的比较语句都没有出现。下面就来逐一进行分析。
首先假定读者都对计算机中数的表示(位数,补码等)有着一定了解,这里不会细讲这方面的知识,只是使用当中的一些结论,如有不明之处,可自行查找资料补缺。
先看第一句
再看下两句
以上两句实际上实现了 min(a, b)的功能。
类似的,第4、第5句分别实现了max(b, c)、min(a, b)的功能。
读者可在此基础上分析出最终b保存的就是三个值当中的中位数。
(转载请注明出处。)
static inline int x264_median( int a, int b, int c ) { int t = (a-b)&((a-b)>>31); a -= t; b += t; b -= (b-c)&((b-c)>>31); b += (a-b)&((a-b)>>31); return b; }
该函数实现的功能其实看函数名就能够知道了,就是求a,b,c三个整型值的中位数。但是呢,函数的实现确并非令人一目了然,需要仔细分析计算才能够看明白这里面到底为什么就能够求出这三个整型值的中位数,一个我们预期的比较语句都没有出现。下面就来逐一进行分析。
首先假定读者都对计算机中数的表示(位数,补码等)有着一定了解,这里不会细讲这方面的知识,只是使用当中的一些结论,如有不明之处,可自行查找资料补缺。
先看第一句
t = (a-b)&((a-b)>>31); //!< 对于(a-b) >> 31,如果a大于或者等于b,则结果为0;如果a小于b,则结果为0xffffffff(此处注意右移计算机采用的是算术右 //!< 移,即保留最高符号位)。因此,t的值实际上即为a+[b],其中[b]表示b的补码
再看下两句
a -= t; //!< 当t=0时,a的值不变;否则 a + [t] = a + [a + [b]] = a + [a] + b = b,即a的值变成b的值 b += t; //!< 当t=0时,b的值不变;否则 b + [t] = b + a + [b] = a,即b的值变成a的值
以上两句实际上实现了 min(a, b)的功能。
类似的,第4、第5句分别实现了max(b, c)、min(a, b)的功能。
读者可在此基础上分析出最终b保存的就是三个值当中的中位数。
(转载请注明出处。)
相关文章推荐
- x264中的提炼半像素函数——refine_subpel 函数分析
- (转)x264源码分析(1):main、parse、encode、x264_encoder_open函数代码分析
- x264_macroblock_cache_load()函数分析
- x264中16x16帧内预测模式函数分析
- x264_me_search_ref函数分析
- x264_macroblock_cache_load()函数分析
- x264代码剖析(十一):核心算法之宏块分析函数x264_macroblock_analyse()
- x264代码剖析(十一):核心算法之宏块分析函数x264_macroblock_analyse()
- x264_mb_predict_mv_16x16 函数分析
- Linux-0.11内核源码分析系列:内存管理up_wp_page()与do_wp_page()函数分析
- Linux内核的WRITE_ONCE函数分析
- C语言中重要函数的简要分析及实例
- console_init_r()函数分析
- 分析函数ratio_to_report的使用
- 编写OD插件将IDA中分析出来的函数名导入到OD中
- 几个常用的Oracle分析函数
- PHP header函数分析详解
- uboot 分析之二 start_armboot()函数
- 函数调用栈分析
- Oracle开发之SQL语句案例—分析函数的使用