可能初看標題沒能明白,記錄的是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一類或者對齊相關中會經常使用到。
以上兩個均是以位運算代替判斷或者複雜計算,值得借鑑。