Se la versione di Python lo ha (≥2.7 per Python 2, ≥3.1 per Python 3), utilizzare il metodo bit_length
dalla libreria standard.
Altrimenti, len(bin(n))-2
as suggested by YOU è veloce (perché implementato in Python). Si noti che questo restituisce 1 per 0.
Altrimenti, un metodo semplice è ripetutamente dividere per 2 (che è un po 'spostamento lineare), e contare il tempo necessario per raggiungere 0.
def bit_length(n): # return the bit size of a non-negative integer
bits = 0
while n >> bits: bits += 1
return bits
Si è significativamente più veloce (almeno per grandi numeri - un rapido benchmark dice più di 10 volte più veloce per 1000 cifre) per spostarsi di parole intere alla volta, quindi tornare indietro e lavorare sui bit dell'ultima parola.
def bit_length(n): # return the bit size of a non-negative integer
if n == 0: return 0
bits = -32
m = 0
while n:
m = n
n >>= 32; bits += 32
while m: m >>= 1; bits += 1
return bits
Nel mio punto di riferimento rapido, len(bin(n))
venuto fuori significativamente più veloce anche la versione pezzo parola di dimensioni. Sebbene bin(n)
costruisca una stringa che viene scartata immediatamente, viene visualizzata in primo piano perché ha un ciclo interno che viene compilato per codice macchina. (math.log
è ancora più veloce, ma non è importante dal momento che è sbagliato.)
int.bit_length(): Il ritorno il numero di bit necessari per rappresentare un numero intero in binario, escludendo il segno e gli zeri iniziali. http://docs.python.org/2/library/stdtypes.html#additional-methods-on-integer-types – wap26
possibile duplicato di [modo rapido di contare i bit in python] (http://stackoverflow.com/questions/9829578/fast-way-of-counting-bit-in-python) – endolith