Il modo tradizionale
int count = 32;
for(int i = 1 << 31; i != 0; i >>= 1, count--)
if((number & i) != 0) return count;
È possibile ottenere ulteriori fantasia con l'ottimizzazione.
EDIT 2 Ecco il codice più veloce che potrei pensare senza l'utilizzo dell'opcode Bit Scan Reverse. È possibile utilizzare una LUT più grande (256 voci) e rimuovere l'ultima istruzione IF. Nel mio test questo è stato più veloce del ripetuto OR-SHIFT, quindi il metodo LUT descritto in un altro post.
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];
}
O se il vostro in architettura x86 o x86-64 bit è possibile utilizzare il codice operativo BSR (Bit Scan Reverse). Potete trovare il C++ intrinseca per esso http://msdn.microsoft.com/en-us/library/fbxyd7zd%28v=vs.80%29.aspx
Inoltre è in discussione è simile a questo What is the fastest way to calculate the number of bits needed to store a number
EDIT Perché le risposte log2 non sono ottimali ... Mentre le operazioni matematicamente corretto, virgola mobile complesse (seno, coseno, abbronzatura, log) sono le operazioni con prestazioni più lente sui computer moderni. Questo è aggravato dal fatto di dover convertire un intero in un float e di doverlo definire soffitto/pavimento.
fonte
2012-01-24 17:27:54
Che, fondamentalmente, vogliono [calcolare ceil (log2 (n))] (http://stackoverflow.com/questions/3272424/compute-fast-log-base-2-ceiling), che è già stato chiesto qui. –
_BitScanReverse (MSVC) o equivalente. Qualsiasi cosa che calcoli un logaritmo a virgola mobile viene immediatamente squalificata quando si richiede il modo più veloce. – harold
Il modo più veloce dipenderà dal processore, ma puoi trovare le soluzioni gcc e MS che utilizzeranno le istruzioni cpu qui: http://stackoverflow.com/questions/3272424/compute-fast-log-base-2-ceiling –