2013-03-24 11 views
10

Mi sono imbattuto in uno scenario interessante, quando si lavora con l'operatore di spostamento bit per bit. Se il secondo operando è negativo, come funziona l'operazione di spostamento bit a bit? .Operatore bit shift con spostamento con numero negativo

i.e a < < b, "< <" sposta un bit pattern a sinistra di b bit in a. Ma se b è neagtive, non dovrebbe essere un errore in fase di runtime?

Sono in grado di eseguire correttamente il codice riportato di seguito, ma non capisco come funziona?

public static void bitwiseleftShift(char testChar) 
{ 
    int val=testChar-'a'; 
    int result= 1<<val; 
    System.out.println("bit wise shift of 1 with val="+val+" is "+result); 
} 

ingresso

bitwiseleftShift('A');// ASCII 65 
    bitwiseleftShift('0'); // ASCII 48 

Risultati

bit wise shift of 1 with val=-32 is 1 
    bit wise shift of 1 with val=-49 is 32768 

ASCII per 'a' è 97. Qualcuno può aiutarmi a capire come funziona?

risposta

9

Ma se b è neagtive, non dovrebbe essere un errore in fase di esecuzione?

Non secondo il linguaggio Java Specification, section 15.19:

Se il tipo promosso dell'operando di sinistra è int, vengono utilizzati solo i cinque bit più basso di ordine del operando a destra come la 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.

Quindi uno spostamento di -32 in realtà finisce con uno spostamento di 0, e uno spostamento di -49 in realtà finisce con uno spostamento di 15 - quindi i risultati che hai visto.

+0

Grazie John! Questo risponde .. Dice che non posso accettare risposta fino a 6 minuti in più ... :(A proposito, grande fan! Sono contento che tu abbia risposto! – prashantsunkari