x264_median 函数分析

先上代码:

 

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保存的就是三个值当中的中位数。

 

(转载请注明出处。)




  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值