可能初看标题没能明白,记录的是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 = a
- a ^ (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,即返回偏小数a - a >= 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一类或者对齐相关中会经常使用到。
以上两个均是以位运算代替判断或者复杂计算,值得借鉴。