CV_IMIN、CV_IMAX宏以及是否只有一位为1的检验

发布时间:2016-12-7 0:04:07 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"CV_IMIN、CV_IMAX宏以及是否只有一位为1的检验",主要涉及到CV_IMIN、CV_IMAX宏以及是否只有一位为1的检验方面的内容,对于CV_IMIN、CV_IMAX宏以及是否只有一位为1的检验感兴趣的同学可以参考一下。

可能初看标题没能明白,记录的是OpenCV中不需要跳转的min和max宏以及另外一个位运算的等式。 他们有一些共性,所以放在一起。先来看看CV_IMIN和CV_IMAX宏,定义如下(仅以CV_IMIN为例) 以下部分转自http://www.cnblogs.com/speedmancs/archive/2011/05/07/2039535.html ************************************************************************************************** 1 #define  CV_IMIN(a, b)  ((a) ^ (((a)^(b)) & (((a) < (b)) - 1)))   这里^是异或运算,两位若相同,结果为0,否则为1,其实就是没有进位的加法运算。异或有如下性质(可自行验证) a ^ 0 = aa ^ (a ^ b) = b (验证时,可假设a和b的二进制表示分别为 a = a1a2…an b = b1b2…bn) 分情况讨论 a < b 此时 (a) < (b) 为1, 减去1后,变为0. (a^b) & 0后变成0,最后a ^0 = a,即返回偏小数aa >= b 此时 (a) < (b) 为0,减去1后,变为-1,-1的二进制表示中,每一位都是1,从而 a^b与上-1后,仍为a^b,最后 a ^ (a ^ b) = b 这样得到的结果为最小值,且没有CV_MAX中的跳转。 *****************************************转载结束****************************************************** OpenCV的cvAlignPtr中在做指针对齐的时候,要检测给出的align是否是2的n次幂或者是0,用到下式来表达: align & ( align -1 ) == 0 当等式成立时,align一定是2的n次幂(或者align=0)。简单证明如下:如果align的二进制形式中有2个以上位为1,则高位1在align-1的二进制形式中一定能够保留为1不变,则结果一定不为0;当align的二进制形式中仅有一位为1时,先假设该位为右数第n位,align-1中必然借位形成第0至n-1位均为1.这样得到的结果就是0了。align=0的情况同样也是满足这个等式的。 这种检验在MASK一类或者对齐相关中会经常使用到。 以上两个均是以位运算代替判断或者复杂计算,值得借鉴。

上一篇:Node.js【一】安装并搭建环境
下一篇:MonoBehaviour.OnPostRender 当渲染之后

相关文章

相关评论