在看x264代码的时候,经常会看到类似对一个变量作如下操作:
... !! variable //!< variable为某一个变量名
一个“!”即逻辑反,那么就会有这么个疑问:“!!”即否定的否定,仍然是本身,这么做有何意义呢?
看下面这么个例子:
if( !b_end )
{
int i, j;
for( j=0; j<=h->sh.b_mbaff; j++ )
for( i=0; i<3; i++ )
{
memcpy( h->mb.intra_border_backup[j][i],
h->fdec->plane[i] + ((mb_y*16 >> !!i) + j - 1 - h->sh.b_mbaff) * h->fdec->i_stride[i],
h->sps->i_mb_width*16 >> !!i );
}
}
比较容易就能看出来,memcpy在依次对Y,U,V三个分量进行拷贝,当中就用到了“!! i”,i的取值范围为0~2,当i为0时,“!! i”的结果仍为0,而当i为1或者2时,“!! i”的结果均为1,在语句当中的意义就是色度分量的坐标值应为亮度分量的一半(坐标值右移1位,相当于除以2)。那么我们可以由此得知,“!!”的作用就是将变量值化为0或1,特别地,只要是非零值,该语句均将其转换为1。“!!”等价于下面一段程序:
if (variable == 0)
variable = 0;
else
variable = 1;
x264代码的其余地方都可以作类似分析。