先上代码:
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保存的就是三个值当中的中位数。
(转载请注明出处。)