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

本文介绍了OpenCV中CV_IMIN宏实现最小值选取的方法及位运算判断2的幂次的应用。CV_IMIN宏通过位运算避免了条件判断,提高了效率。判断2的幂次的应用在对齐操作中十分常见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可能初看标题没能明白,记录的是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,其实就是没有进位的加法运算。异或有如下性质(可自行验证)

  1. a ^ 0 = a
  2. a ^ (a ^ b) = b

(验证时,可假设a和b的二进制表示分别为

a = a1a2…an

b = b1b2…bn)

分情况讨论

  1. a < b
    此时 (a) < (b) 为1, 减去1后,变为0. (a^b) & 0后变成0,最后a ^0 = a,即返回偏小数a
  2. 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一类或者对齐相关中会经常使用到。

以上两个均是以位运算代替判断或者复杂计算,值得借鉴。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值