Cosa fa >> fa in java?

Va bene, ho provato a cercare cosa >>, o shift significa, ma è un modo sopra la mia testa come questo sito lo spiega: http://www.janeg.ca/scjp/oper/shift.html

Quindi qualcuno può spiegarlo come se stessero parlando con un bambino?

I computer sono dispositivi binari. Per questo motivo, i numeri sono rappresentati da una sequenza di 1 e 0.

Bitshifting sta semplicemente spostando quelle sequenze di 1 e 0 a sinistra o a destra.

Quindi tutto l’operatore >> fa è spostare i bit verso il giusto un bit.

Considera il numero 101:

 // Assuming signed 8-bit integers 01100101 // How 101 is represented in binary 00110010 // After right shifting one bit, this represents 50 

Il bit meno significativo in questo caso è stato troncato. Ovviamente il diavolo è nei dettagli, ma questo è tutto ciò che c’è davvero.

L’operatore << esegue l'operazione opposta:

 // Assuming signed 8-bit integers 01100101 // How 101 is represented in binary 11001010 // After left shifting one bit, this represents -54 // Assuming unsigned 8-bit integers 01100101 // How 101 is represented in binary 11001010 // After left shifting one bit, this represents 202 

In questo caso, il bit più significativo è stato troncato poiché ho usato solo 8 bit. Se il numero aveva più bit, tuttavia:

 // Assuming signed 16-bit integers 00000000 01100101 // How 101 is represented in binary 00000000 11001010 // After left shifting one bit, this represents 202 00000001 10010100 // After left shifting one bit again, this represents 404 

Quindi puoi ottenere numeri diversi a seconda del numero di bit e dei tipi di dati associati a quei bit con cui hai a che fare.

Addendum: se ti stai chiedendo come funziona il binario, pensa a come funziona il sistema di numeri decimali. Considera il numero 5287. Può essere scritto così:

 5287 

Ma puoi anche scriverlo in questo modo:

 5287 = (5 * 1000) + (2 * 100) + (8 * 10) + (7 * 1) 

Che puoi quindi scrivere in questo modo:

 5287 = (5 * 10^3) + (2 * 10^2) + (8 * 10^1) + (7 * 10^0) 

L'equazione precedente spiega perché il sistema dei numeri decimali è talvolta chiamato sistema base-10. Il sistema numerico decimale utilizza 10 cifre (0-9). Nota come gli esponenti corrispondono alla posizione delle cifre.

Il sistema di numeri binari, o il sistema di base 2, è la stessa identica cosa ma con il numero due come base degli esponenti e impiegando solo due cifre: 0 e 1.

 5287 = 00010100 10100111 (base 2) = (0 * 2^15) + (0 * 2^14) + (0 * 2^13) + (1 * 2^12) + (0 * 2^11) + (1 * 2^10) + (0 * 2^9) + (0 * 2^8) + (1 * 2^7) + (0 * 2^6) + (1 * 2^5) + (0 * 2^4) + (0 * 2^3) + (1 * 2^2) + (1 * 2^1) + (1 * 2^0) 

>> l’operatore SHIFT RIGHT

Esempio:

 class X { public static void main(String args[]) { System.out.println("20>>2 = "+20>>2); } } 

Uscita: 20>>2 = 5

Spiegazione:

Il valore binario di 20 è: 00000000000000000000000000010100

sposta tutti i bit 2 posizioni a destra 00000000000000000000000000000101

Darà 5 ( 2*2^2+0*2^1+1*2^0 )

Posso presumere che il bambino con cui sto parlando conosca un po ‘di binario? 🙂

Tutti i numeri possono essere rappresentati in qualche tipo di binario, in questo modo:

  Base 10 : Base 2 1 : 0001 2 : 0010 3 : 0011 4 : 0100 5 : 0101 6 : 0110 7 : 0111 8 : 1000 

… e così via.

Gli operatori di spostamento spostano sostanzialmente tutti i bit (1 o 0) su una posizione. Quindi, ad esempio: 000111 >> 1

sposta tutti i bit in 000111 a destra di un numero per produrre questo:

000011

000111 << 1

sposta tutti quei bit lasciati da uno, per produrre questo:

001110

Se si sposta di più di uno, quindi sposta ulteriormente i bit.

Ora, a seconda della lingua che stai usando e del tipo di numeri con cui stai lavorando, può essere un po ‘più complicato di così. Ad esempio, se stai lavorando in una lingua in cui il “bit più significativo” (quello più a sinistra in un numero) rappresenta se il numero è firmato o meno, allora la lingua dovrà tenerne conto.

Matematicamente parlando, se prendi un numero intero (e ignori il rischio di tracimazioni, che sono causate dal fatto che il computer sta esaurendo lo spazio per archiviare i bit,) lo spostamento a sinistra di 1 (<< 1) equivale a moltiplicare per 2 e a spostarsi a destra di 1 equivale a dividere per 2. (Pensa un po 'a cosa vale un "valore del luogo" nella matematica binaria, e questo ha senso)

Una volta ho scritto una JApplet (bitorgel) e l’ho messa sulla mia pagina web , dove si può giocare con gli operatori di bit. Puoi provarlo dal vivo o scaricare la fonte. AFAIK funzionano allo stesso modo in C, C ++ e Java, probabilmente anche in C #.