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,其實就是沒有進位的加法運算。異或有如下性質(可自行驗證)

  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一類或者對齊相關中會經常使用到。

以上兩個均是以位運算代替判斷或者複雜計算,值得借鑑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章