ePrometeusCorsoJavaJava
testi articoli
Testi Articoli  Download
Home | Basi | Espressioni | Comandi | Classi | Ereditarieta | Eccezioni | Thread | Utilita | 
CorsoJava è ora Video! Free for all!
Clicca Qui!

Espressioni
Espressioni
Primitivi
Costanti
Booleane
Carattere
Numeri
Operatori
Promozione
Overloading
Aritmetici
Virgola Mobile
Relazionali
Binari
Shift
Negazione
And
Or
Condizionale
Incremento
Assegnamento

<<< Shift >>>

questa lezione leggermente complessa, ma non richiede di essere capita a fondo anche perché tratta di operazioni che si usano abbastanza di rado.

<< >> >>>
operano su interi

gli operatori visti prima, di tipo logico, si applicano sia la interi che a booleani. Gli operatori che adesso vediamo invece si applicano esclusivamente a interi; questo perché hanno senso solamente sulla maschera di bit di un intero. Si tratta infatti le gli operatori cosiddetti di shift, o slittamento. Queste operatori considerano un intero come una maschera di bit, che ruotano una maschera a destra o a sinistra di certo numero di posizioni. Anche In questo caso bisogna tenere conto della precisione: se stiamo operando su un intero, lo slittamento avviene per 32 bit, mentre se stiamo operando su un long, slittamento avviene per 64 bit. Facciamo due esempi ipotizzando che stiamo operando su soli quattro bit (anche se questo non è mai possibile). Tenere presente che non è possibile scrivere direttamente il numero in binario.

0101 >> 1 == 0010
0011 << 2  == 1100

La slittamento a sinistra causa sempre inserimento di bit 0 in coda, e non presenta particolari difficoltà. Discorso cambia leggermente quanto si considerano slittamento a destra, in quanto coinvolge l'ultimo bit che è speciale, in quanto rappresenta il segno.

>> shift con estensione di segno
-2>>1  ==  -1
utile quando si considera l'intero un valore con segno
>>> shift senza estensione di segno
-2>>>1 == 2147483647
utile quando si considera l'intero una maschera di bit

Per capire i problemi occorre sapere alcune cose di come un numero viene trasformato in una maschera di bit. Consideriamo un semplice caso come 12. Che questo essere scritto come somma di potenza di due in questo modo: 2^3 + 2^2, la sua rappresentazione in binario è 1100. In generale lo slittamento a sinistra di una posizione equivale a una moltiplicazione per due, mentre lo slittamento a destra di una posizione equivale ad una divisione per due.


Ma cosa succede quando il numero diventa negativo? Si usa una variazione fa in modo che l'ultimo bit rappresenti il segno. Per evitare di avere due zeri diversi (lo zero positivo e lo zero negativo) i numeri negativi hanno hanno una rappresentazione leggermente diversa. Non importa quale che sia questa rappresentazione, la cosa veramente importante è il fatto che i numeri negativi hanno l'ultimo bit a 1, mentre quelli positivi hanno l'ultimo bit a zero.

Il problema è che bisogna decidere se, quando si slitta, si deve inserire uno zero o qualcos'altro. Si vuole inserire sempre uno zero, si deve usare l'operatore >>>. Questo operatore però quando sono coinvolti numeri negativi causa effetti abbastanza inaspettati: siccome fa passare dalla rappresentazione dei numeri negativi a quella dei numeri positivi, il valore ne viene sconvolto. Per fortuna, quando si vuole far corrispondere lo slittamento a destra ad una divisione per due anche per i numeri negativi, si può utilizzare l'operatore >>. Questo operatore fa un'operazione che si chiama estensione del segno. Ovvero inseris di ce nel posto che si è liberato un bit uguale a quello che è uscito. Per le regole dell'aritmetica speciale dei numeri negativi valore corrisponde a divisione per due anche per i numeri negativi.

ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com