2013-02-11 12 views
8

Perché seoperazioni java bit >>> spostare

int x = -1 // binary: 11111111111111111111111111111111 
x = x >>> 31; 

abbiamo 00000000000000000000000000000001

ma se

int x = -1 
x = x >>> 32; 

abbiamo 11111111111111111111111111111111 (nuovo) -1

ma non 00000000000000000000000000000000 ?

+1

Poiché gli spostamenti in Java sono sempre modulo la lunghezza del valore spostato. –

+1

Questo è DAVVERO buono a sapersi, considerando che è semplicemente sbagliato da un punto di vista matematico! –

risposta

13

Da Section 15.19 of JLS:

Se il tipo promosso dell'operando di sinistra è int, solo le cinque bit più basso ordine dell'operando di destra servono come spostamento distanza. È come se l'operando di destra fosse soggetto a un operatore AND logico bit a bit &(§15.22.1) con il valore di maschera 0x1f (0b11111). La distanza di spostamento effettivamente utilizzata è quindi sempre nell'intervallo 0 to 31, incluso.

Enfasi mia. Quindi:

x >>> n 

è equivalente a:

x >>> n & 0x1f // or x >>> n % 32 

Quindi, x >>> 32 è equivalente a x >>> 32 & 0x1f < ==> == x >>> 0x.

Così il Regola generale è, ogni volta che si sposta un numero di un multiplo di 32 (int è 32 bits), si ottiene di nuovo lo stesso valore.

+0

+1, Perfect (Y) –

+0

IMHO, questa è una scelta davvero sbagliata! Matematicamente, i due non sono assolutamente equivalenti. Ora, se si trattava di un'operazione ** rotate **, piuttosto che di un turno, ok. Ma questo? Chi l'ha inventato? –

+0

Come dovrei spostare >>> per avere uno 0 come risultato? – ses

2

Quando si applica l'operazione di spostamento di bit vengono considerati solo i 5 bit più bassi dell'operando di destra. Dal 32 === 0 // mod 32, il risultato non è mai cambiato.

0

trascorso un'intera giornata rompere la mia testa sul perché un lungo l = i < < 32 comportato stranamente, poi scrisse alcuni test di base, ha avuto il momento WTF, e poi chnged a lungo l = (lungo) i < < 32 per funziona.

Il mio unico add alla risposta di Rohit è il motivo per cui è così. Da IA-32 Software di sviluppo del software Intel Architecture 3:

L'8086 non maschera il numero di turni. Tuttavia, tutti gli altri processori IA-32 (a partire dal processore Intel 286) mascherano il numero di shift a 5 bit, risultando in un conteggio massimo di 31. Questo mascheramento viene eseguito in tutte le modalità operative (inclusa la modalità 8086 virtuale) ridurre il tempo massimo di esecuzione delle istruzioni