2016-03-30 94 views
13

Qualcuno può spiegare perché le seguenti espressioni bit per bit restituiscono risultati diversi:Java operatore bit a bit <<

System.out.println((-1<<31)<<1); // it prints 0 
System.out.println(-1<<32);  // it prints -1 
+1

anche http://stackoverflow.com/q/34193787/1743880 e http: // stackoverflow.com/q/3170412/1743880 – Tunaki

+0

@Tunaki: Sì, è simile. – nenito

risposta

14

-1<<32 è equivalente a -1<<0, vale a dire un no-op. La ragione è che la distanza di spostamento (32) è E-ed con 0x1f e 32 & 0x1f è 0.

questo è definito nel JLS #15.19 (sottolineatura mia):

Se il tipo promosso dell'operando di sinistra è int, quindi solo i cinque bit di ordine inferiore dell'operando di destra vengono utilizzati come distanza di spostamento. È 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 compresa tra 0 e 31.

3

Il valore di conteggio cambio viene utilizzata modulo 32. Così il secondo esempio è in realtà lo stesso spostamento per 0.