Corso di Java

Operatori sui bit

 

Gli operatori sui bit permettono di manipolare i singoli bit di un tipo di dato primitivo, eseguendo operazioni di algebra booleana sui bit corrispondenti dei due argomenti.
Innanzitutto dobbiamo ricordarci che tutte le informazioni circolano, all’interno di sistemi digitali come il computer, sotto forma di valori 0 (zero) e 1 (uno): ogni oggetto del linguaggio, sia esso un tipo di dato primitivo o l’istanza di una classe, è rappresentato all’interno del computer mediante opportune combinazioni di queste due cifre, dette bit (binary Digit).
Per operare con le cifre binarie 0 e 1 ci si avvale della cosiddetta Algebra di Boole, che fornisce un insieme di regole con le quali è possibile combinare queste cifre per effettuare operazioni aritmetiche elementari.
Le operazioni più complesse e le cosiddette funzioni booleane possono essere realizzate per mezzo di appropriate sequenze di queste operazioni elementari.

L’operatore binario AND (&) produce un 1 se entrambi gli operandi sono 1, 0 altrimenti:

OPERATORE AND BINARIO
Operando 1
Operando 2
Risultato

0

0

0

0

1

0

1

0

0

1

1

1


L’operatore binario OR (|) produce un 1 se almeno uno degli operandi è 1, 0 altrimenti:

OPERATORE OR BINARIO
Operando 1
Operando 2
Risultato

0

0

0

0

1

1

1

0

1

1

1

1

L’operatore binario OR esclusivo (^), brevemente indicato come XOR, produce un 1 se gli operandi hanno valori diversi, 0 se hanno lo stesso valore:

OPERATORE XOR BINARIO
Operando 1
Operando 2
Risultato

0

0

0

0

1

1

1

0

1

1

1

0


L’operatore logico NOT (~), chiamato anche complemento a uno, è un operatore unario (opera cioè con un solo operando) e produce il valore opposto del suo operando:

OPERATORE NOT
Operando
Risultato

0

1

1

0

 

Gli operatori binari utilizzano gli stessi caratteri dei corrispondenti operatori logici, cosicché è più facile avere un metodo mnemonico per ricordarne l’utilizzo e il significato.
Anche gli operatori binari possono essere combinati col segno = per istruzioni di assegnamento abbreviate: &=, |= e ^= sono forme permesse.
Naturalmente, poiché ~ è un operatore unario, non può essere combinato con il segno =.

Il tipo booleano è trattato come un valore ad un bit, con una differenza: è possibile eseguire operazioni binarie di tipo AND, OR e XOR, ma non si può eseguire il NOT binario (probabilmente per evitare confusione con il NOT logico).
Per i booleani gli operatori binari hanno lo stesso effetto degli operatori logici, eccezion fatta per l’effetto “short circuiting” (a tal proposito rivedete la lezione precedente).

Vediamo un esempio di applicazione di AND binario a due interi, 12 e 15:

12 & 15

il risultato che si ottiene è 12.
Nonostante l’apparente stranezza del risultato, la spiegazione è molto semplice: la rappresentazione binaria di 12 è 1100, mentre la rappresentazione binaria di 15 è 1111.
L’operatore AND esegue l’and logico bit a bit tra le due stringhe, cosicché, se mettiamo in colonna le due rappresentazioni binarie ed eseguiamo l’operazione, otterremo:

    1100
  & 1111
    ----
    1100


che è ancora la rappresentazione binaria del numero 12.

Un altro tipo di operazione che si può effettuare sui bit è lo shift, ossia lo slittamento delle cifre binarie di un certo numero di posizioni verso destra o verso sinistra.
In Java esistono 3 operatori di shift:

OPERATORE

USO

>>

op1 >> op2

<<

op1 << op2

>>>

op1 >>> op2


Questi operatori possono essere utilizzati solo con i tipi primitivi.

L’operatore >> sposta verso destra le cifre dell’operando op1 di un numero di bit pari al valore specificato da op2, inserendo, al posto dei bit di ordine più alto, degli zero se op2 è positivo o degli uno se op2 è negativo.
Questa caratteristica è detta estensione in segno e non è utilizzata dall’operatore >>>, che ha la stessa funzione del precedente (cioè spostare verso destra i bit di op1 secondo il valore di op2), ma che inserisce sempre al posto dei bit più segnificativi degli zero, qualsiasi sia il segno di op2.

Ad es.:

13 >> 1

sposta i bit che rappresentano il numero 13 (1101) verso destra e aggiunge un 1 nella cifra più significativa, originando il valore 6 (0110).
L’operatore << sposta verso sinistra le cifre dell’operando op1 di un numero di bit pari al valore specificato da op2, inserendo degli zero al posto dei bit di ordine più basso.

Se questi operatori sono appplicati a variabili di tipo char, byte o short, esse vengono automaticamente convertite in int prima dell’operazione di shift, e il risultato prodotto è di tipo int.
Al fine di prevenire abusi nel numero di posizioni di cui viene shiftato un int, vengono presi in considerazione solo i 5 bit di ordine più basso di op2.
Se si opera con una variabile di tipo long, il risultato dello shift è ancora un long, ma vengono considerati solo gli ultimi 6 bit di op2.
Anche per gli operatori di shift esistono delle istruzioni di assegnamento abbreviate: >>=, <<=, >>>=.

 

Torna all'indice Generale del corso di Corso di Java di Software Planet