2016-06-06 8 views
-1

Wenn ich C++ Header-Dateien von opencv durchsuchen, Es passiert zufällig, das Konstrukt (ptr + n-1) & -n in alignPtr Funktion zu sehen. Die vollständige Funktion wie folgt(ptr + n-1) & -n Was bewirkt dieser Ausdruck?

/*! 
    Aligns pointer by the certain number of bytes 

    This small inline function aligns the pointer by the certain number of bytes by shifting 
    it forward by 0 or a positive offset. 
*/ 
template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp)) 
{ 
    return (_Tp*)(((size_t)ptr + n-1) & -n); 
} 

Können Sie erklären, wie es funktioniert?

+1

Diese kleine Inline-Funktion richtet den Zeiger um eine bestimmte Anzahl von Bytes aus, indem er um 0 oder einen positiven Offset nach vorne verschoben wird. – erip

+0

@erip das ist in der Tat sehr lustig, obwohl die Frage Zitat ist, "wie es funktioniert", Ende des Zitats. – bereal

+1

@bereal Ich habe es nach dem Posten bemerkt. Ich bin nicht lustig. – erip

Antwort

1

In diesem Ausdruck seiner impliziten dass n eine Potenz von 2 wie 2, 4, 8 usw. Nehmen wir an, dass n2^m

In einer Zweier-Komplement-Binärsystem ist:

  • -2 ist ... 11110
  • -4 ist ... 11100
  • -8 ist ... 11000

Im Allgemeinen hat n = -2^m eine Darstellung mit genau der m rechten Ziffern Null ist.

Das heißt, wenn wir eine beliebige Anzahl und & es mit -2^m nehmen, dann wird es mit den m rechten Ziffern Null ist, und die anderen Ziffern beibehalten, die die Antwort ein Vielfaches von 2^m macht zurückgegeben werden.

Das bedeutet, dass der Ausdruck x & -2^m die Nummer effektiv auf das größte Vielfache von 2^m "unterschreitet", das kleiner oder gleich x ist.

Die Zugabe von (n - 1), das getan wird:

(x + (n-1)) & -2^m 

effektiv dies von einem „Boden“ zu einem „Runden“ ändert.