Gli operatori logici in Visual Basic Net? Li trovi su Opentraining.it Visual Basic Italia
Corso di Visual Basic:
Ottava lezione - Altro ancora sulle variabili Booleane, Bit e Byte (a cura di Giorgio Abraini)

Finora abbiamo visto come vengono valutate le espressioni per verificare se sono true o false, e negli esempi abbiamo sempre usato dei confronti: in realtà questo spesso non è necessario, anzi è ridondante; consideriamo ad esempio questa condizione:

If frmAbout.Visible = True Then

La condizione risulta true se frmAbout.Visible è True, risulta False se frmAbout.Visible è False: in parole povere il valore della condizione è identico al valore di frmAbout.Visible; pertanto non c'è alcun bisogno di effettuare il confronto, ma sarà sufficiente scrivere:

If frmAbout.Visible Then
Infatti la condizione valutata dalla if deve essere interpretabile come un valore Boolean, e frmAbout.Visible è proprio un valore Boolean che può quindi essere usato direttamente come una condizione. E se avessimo bisogno di confrontare questa proprietà con False? E' semplicissimo, basta fare:

If Not frmAbout.Visible = True Then

Se il form non è visible, la condizione sarà verificata e le istruzioni saranno eseguite. Una cosa simile si può fare anche con i valori numerici: bisogna infatti sapere che i valori True e False in realtà non sono altro che numeri, e precisamente la parola chiave true corrisponde al valore -1 e la parola chiave false corrisponde al valore 0. Provate infatti a creare un nuovo progetto, a inserire un CommandButton e a scrivere queste righe nella routine dell'evento click:

Dim blnProva As Boolean
blnProva = -1
Debug.Print blnProva
blnProva = 0
Debug.Print blnProvaa
Una volta avviato il progetto, quando premerete il pulsante vedrete nella finestra immediata:
True
False

Ora provate a scrivere, al posto di "blnProva = -1", "blnProva = 34" e riavviate il progetto: ripremendo il pulsante, vedrete ancora nella finestra immediata:
True
False

Questo accade perché, quando un valore numerico viene convertito in Boolean, esso è interpretato da VB come true se è diverso da 0, anche se il valore predefinito di true è -1, ed è interpretato come false quando è uguale a 0.
Analogamente, è possibile convertire un valore Boolean in un valore numerico:

Dim intProva As Integer
intProva = True
Debug.Print intProva
intProva = False
Debug.Print intProva
Questa volta premendo sul pulsante vedrete nella finestra immediata:
-1
0

Insomma, le parole chiave True e False funzionano quasi come delle variabili numeriche il cui valore è rispettivamente -1 e 0: infatti la guida in linea di Visual Basic afferma che le variabili Boolean sono memorizzate come variabili numeriche a 16 bit (2 byte), ossia come gli Integer. Ma se un numero può essere direttamente interpretato come un valore Boolean, non c'è bisogno di scrivere, ad esempio:

If intProva <> 0 Then '<> significa "diverso da"
ma si può scrivere direttamente:

If intProva Then
La conversione tra valori numerici e Booleani non è invece immediata quando si usano gli operatori logici; proviamo ad esempio a scrivere:

If 4 And 2 Then
Si potrebbe pensare che, essendo 4 <> 0 e 2 <> 0, e quindi entrambi True, la condizione risulti verificata perché True And True = True; invece no.
Il fatto è che gli operatori logici, se applicati a valori o variabili numeriche, eseguono un confronto "bit a bit" dei due operandi. Qui occorre fare una breve digressione sui bit e sui byte. Un bit è l'unità fondamentale su cui si basa il funzionamento di un computer, e può assumere solo due valori: 0 e 1; questa caratteristica deriva dal fatto che i supporti fisici di memorizzazione dei dati possono assumere solo due stati stabili: possono cioè essere magnetizzati in senso positivo oppure negativo. Pertanto i processori eseguono i calcoli in base al sistema numerico binario, cioè in base alle potenze di 2 (perché 2 sono i valori possibili: 0 e 1), mentre noi utilizziamo il sistema decimale, cioè in base alle potenze di 10 (perché 10 sono le cifre da 0 a 9). Solitamente come unità di misura della capacità di memoria dei computer viene preso il byte, che è semplicemente un gruppo di 8 bit contigui: se avessimo un numero di 8 cifre decimali questo sarebbe compreso tra 0 e

10 ^ 8 - 1 = 100.000.000 - 1 = 99.999.999

Invece un numero di 8 cifre binarie (cioè un byte) è compreso tra 0 e

2 ^ 8 - 1 = 256 - 1 = 255

infatti il tipo di dati byte memorizza proprio un numero compreso tra 0 e 255 (v.lez. 1). Un numero di 16 bit (cioè 2 byte, come un integer), ad es., è compreso tra 0 e

2 ^ 16 - 1 = 65535

e così via (il motivo per cui il tipo integer può assumere valori tra -32768 e +32767 lo vedremo un'altra volta). Viceversa, il numero 206 può essere scomposto, in base al sistema decimale, in

200 + 0 + 6 = 2 * 10 ^ 2 + 0 * 10 ^ 1 + 6 * 10 ^ 0

numerando ogni cifra a partire da destra (cioè considerando 6 la prima cifra, 0 la seconda cifra, 2 la terza cifra) potremo scrivere

206 = 2 * 10 ^ (3 - 1) + 0 * 10 ^ (2 - 1) + 6 * 10 ^ (1 - 1)

In altri termini, ogni numero può essere espresso come la somma dei prodotti di ogni cifra per 10 elevato alla posizione occupata da quella cifra meno uno. Questa spiegazione può sembrare molto complicata, ma è importante per capire come convertire un numero decimale in base binaria e un numero binario in base decimale; supponiamo ad es. di avere il numero binario 101: per sapere a quale numero decimale corrisponde, dovremo moltiplicare 1 (la prima cifra da destra) per 2^ (1 - 1); poi dovremo moltiplicare 0 (la seconda cifra) per 2 ^ (2 - 1) e infine 1 (la terza cifra da destra) per 2 ^ (3 - 1). In parole povere:

101 = 1 * 2 ^ (3 - 1) + 0 * 2 ^ (2 - 1) + 1 * 2 ^ (1 - 1) =
= 1 * 2 ^ 2 + 0 + 1 * 2 ^ 0 =
= 4 + 0 + 1 =
= 5



Se invece dovessimo convertire un numero decimale in binario, dovremmo dividere il numero per 2: se il risultato è intero, scriviamo 0, altrimenti 1; poi prendiamo la parte intera della divisione e la dividiamo ancora per 2, e procediamo in questo modo finchè non resta 0; infine si ribalta la serie di 0 e 1 che abbiamo scritto. Ad eempio, per convertire il numero 9 si procede così:

9 / 2 = 4,5
4 / 2 = 2
2 / 2 = 1
1 / 2 = 0,5
0 / 2 = 0
1
0
0
1
0

La successione che abbiamo ottenuto è quindi 10010, che ribaltata diventa: 01001, cioè 1001: infatti

1001 = 1 * 2 ^ (4 - 1) + 0 + 0 + 1 * 2(1 - 1) = 8 + 1 = 9

Ora torniamo al confronto bit a bit. Questo confronto, come dice il termine, prende in considerazione ogni singolo bit di un operando e lo confronta con il bit che occupa la stessa posizione nell'altro operando: il risultato del confronto sarà determinato dall'operatore logico utilizzato, tenendo conto che il bit 0 corrisponde a False e il bit 1 corrisponde a True. Supponiamo ad eempio. di fare 23 And 200:

00010111 (rappresentazione binaria di 23)
11001000 (rappresentazione binaria di 200)
--------
00000000 risultato dell'And bit a bit

Il risultato è 0 perché, per ogni posizione, i bit corrispondenti dei due operandi non sono mai contemporaneamente 1 e 1 (cioè True e True). Facciamo altri esempi:

13 Or 17:

00001101 (13)
00010001 (17)
--------
00011101 (29)


Not 55::

00110111 (55)
----------
11001000 (200)

Nel caso del Not x, vi faccio notare che il risultato è sempre 255 - x, ovvero il valore massimo che può assumere un byte meno il valore dell'operando (nel caso in cui x sia un dato di tipo byte).

Archivio:ndexed
Lezioni Commenta questa lezione Invia la tua guida Avviso per le nuove lezioni
Proponi un argomento

Visual Basic Italia© copyright 2000 - tutti i diritti riservati
E-mail:
vbitalia@libero.it