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
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<<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.
Il valore di conteggio cambio viene utilizzata modulo 32. Così il secondo esempio è in realtà lo stesso spostamento per 0.
anche http://stackoverflow.com/q/34193787/1743880 e http: // stackoverflow.com/q/3170412/1743880 – Tunaki
@Tunaki: Sì, è simile. – nenito