Der traditionelle Weg
int count = 32;
for(int i = 1 << 31; i != 0; i >>= 1, count--)
if((number & i) != 0) return count;
Bei der Optimierung können Sie sich noch mehr einfallen lassen.
EDIT 2 Hier ist der schnellste Code, der mir einfiel, ohne die Verwendung des Bit Scan Reverse Opcodes. Sie könnten eine größere LUT (256 Einträge) verwenden und die letzte IF-Anweisung entfernen. In meinen Tests war dies schneller als die wiederholte OR-SHIFT dann LUT-Methode in einem anderen Beitrag beschrieben.
int[] Log2_LUT = new int[16]{0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4};
int Log2 (number) {
int count = 0;
if((number & 0xFFFF0000) != 0) {
number >>= 16;
count += 16;
}
if((number & 0x0000FF00) != 0) {
number >>= 8;
count += 8
}
if((number & 0x000000F0) != 0) {
number >>= 4;
count += 4;
}
return count + Log2_LUT[number];
}
Bei einer x86- oder x86-64-Bit-Architektur können Sie auch den BSR-Opcode (Bit Scan Reverse) verwenden. Sie können die C++-Intrinsic dafür finden http://msdn.microsoft.com/en-us/library/fbxyd7zd%28v=vs.80%29.aspx
Auch Ihre Frage ist ähnlich wie diese Wie kann man am schnellsten die Anzahl der Bits berechnen, die zum Speichern einer Zahl benötigt werden?
EDITAR Warum die log2-Antworten nicht optimal sind... Obwohl mathematisch korrekt, sind komplexe Gleitkommaoperationen (Sinus, Kosinus, tan, log) die langsamsten Operationen auf modernen Computern. Hinzu kommt, dass eine ganze Zahl in eine Fließkommazahl umgewandelt werden muss und auch noch die Ober- und Untergrenze zu berechnen ist.