2015-11-20 20 views
5

Mentre stavo passando attraverso il codice sorgente ConcurrentHashMap, ho riscontrato così tanti operatori bit shift savianti. Alcuni sono applicati per creare costanti e altri per variabili.Uso dell'operatore bit shift saver in ConcurrentHashMap

static final int MAXIMUM_CAPACITY = 1 << 30; 
static final int MAX_SEGMENTS = 1 << 16; // slightly conservative 
long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE; 

io non sono in grado di capire, se costante come MAXIMUM_CAPACITY potrebbe essere dichiarato direttamente allora che cosa è l'uso di utilizzare operatore di spostamento bit a bit.

+3

Penso che gli sviluppatori abbiano avuto un tempo più semplice per definire quei valori mentre pensavano in binario piuttosto che in decimale. La rappresentazione binaria di '1 << 30' è' 1000000000000000000000000000000', che in un certo senso sembra "più semplice" di decimale '1073741824'. – Mena

risposta

3

Non stanno utilizzando il numero in forma decimale (base 10). Invece, stanno dicendo "questo è un numero con 30 bit 0", il che implica che il numero è utilizzato per i sistemi di base 2.

Il bithifting semplifica l'informazione del lettore sul valore. Nella base 10, rappresenterebbe 1073741824, che sembra un numero casuale.


Questo è comune nella programmazione. Per esempio:

int secondsInDay = 60 * 60 * 24; 

Rappresentiamo la quantità di secondi in un minuto, moltiplicato per il quantità di minuti in un'ora, moltiplicato per il quantità di ore in un giorno.

Avremmo potuto semplicemente inserire 86400, ma se volessimo cambiare quanti minuti sono in un'ora (per rappresentare il tempo su un altro pianeta)? Dovresti calcolarlo manualmente per cambiare il valore.

D'altra parte, suddividendolo in unità come mostrato sopra, possiamo semplicemente cambiare il mezzo 60 per modificare quanti minuti ci sono in un giorno.