Qual è la soluzione migliore per ottenere il logaritmo di base 2 di un numero che conosco è una potenza di due (2^k
). (. Naturalmente so solo il non valore 2^k
k
stesso)Come ottenere lg2 di un numero 2^k
Un modo ho pensato di fare è sottraendo 1 e poi facendo un bitcount:
lg2(n) = bitcount(n - 1) = k, iff k is an integer
0b10000 - 1 = 0b01111, bitcount(0b01111) = 4
Ma c'è un modo più veloce per farlo (senza cache)? Inoltre, qualcosa che non coinvolge più velocemente il bitcount sarebbe bello saperlo?
Una delle applicazioni questo è:
suppose you have bitmask
0b0110111000
and value
0b0101010101
and you are interested of
(value & bitmask) >> number of zeros in front of bitmask
(0b0101010101 & 0b0110111000) >> 3 = 0b100010
this can be done with
using bitcount
value & bitmask >> bitcount((bitmask - 1) xor bitmask) - 1
or using lg2
value & bitmask >> lg2(((bitmask - 1) xor bitmask) + 1) - 2
Per essere più veloce di bitcount senza caching che dovrebbe essere più veloce di O(lg(k))
dove k
è il conteggio dei bit di archiviazione.
probabilmente il modo più veloce che ci sia ...) – Egon