Operatori logici e bit per bit in Visual BasicLogical and Bitwise Operators in Visual Basic

Gli operatori logici confrontano le espressioni Boolean e restituiscono un risultato Boolean.Logical operators compare Boolean expressions and return a Boolean result. Gli operatori And, Or, AndAlso, OrElsee Xor sono binari perché accettano due operandi, mentre l'operatore Not è unario perché accetta un solo operando.The And, Or, AndAlso, OrElse, and Xor operators are binary because they take two operands, while the Not operator is unary because it takes a single operand. Alcuni di questi operatori possono anche eseguire operazioni logiche bit per bit sui valori integrali.Some of these operators can also perform bitwise logical operations on integral values.

Operatore logico unarioUnary Logical Operator

L' operatore not esegue una negazione logica su un'espressione Boolean.The Not Operator performs logical negation on a Boolean expression. Produce l'opposto logico del relativo operando.It yields the logical opposite of its operand. Se l'espressione restituisce True, Not restituisce False; Se l'espressione restituisce False, Not restituisce True.If the expression evaluates to True, then Not returns False; if the expression evaluates to False, then Not returns True. Questa condizione è illustrata nell'esempio seguente.The following example illustrates this.

Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.

Operatori logici binariBinary Logical Operators

L' operatore and esegue una congiunzione logica su due espressioni Boolean.The And Operator performs logical conjunction on two Boolean expressions. Se entrambe le espressioni restituiscono True, And restituisce True.If both expressions evaluate to True, then And returns True. Se almeno una delle espressioni restituisce False, And restituisce False.If at least one of the expressions evaluates to False, then And returns False.

L' operatore OR esegue una disgiunzione logica o un' inclusione su due espressioni Boolean.The Or Operator performs logical disjunction or inclusion on two Boolean expressions. Se una delle due espressioni restituisce Trueo entrambi restituiscono True, Or restituisce True.If either expression evaluates to True, or both evaluate to True, then Or returns True. Se nessuna delle due espressioni restituisce True, Or restituisce False.If neither expression evaluates to True, Or returns False.

L' operatore XOR esegue l' esclusione logica su due espressioni Boolean.The Xor Operator performs logical exclusion on two Boolean expressions. Se esattamente un'espressione restituisce True, ma non entrambi, Xor restituisce True.If exactly one expression evaluates to True, but not both, Xor returns True. Se entrambe le espressioni restituiscono True o entrambe restituiscono False, Xor restituisce False.If both expressions evaluate to True or both evaluate to False, Xor returns False.

Nell'esempio seguente vengono illustrati gli operatori And, Ore Xor.The following example illustrates the And, Or, and Xor operators.

Dim a, b, c, d, e, f, g As Boolean

a = 23 > 14 And 11 > 8
b = 14 > 23 And 11 > 8
' The preceding statements set a to True and b to False.

c = 23 > 14 Or 8 > 11
d = 23 > 67 Or 8 > 11
' The preceding statements set c to True and d to False.

e = 23 > 67 Xor 11 > 8
f = 23 > 14 Xor 11 > 8
g = 14 > 23 Xor 8 > 11
' The preceding statements set e to True, f to False, and g to False.

Operazioni logiche di corto circuitoShort-Circuiting Logical Operations

L' operatore AndAlso è molto simile all'operatore And, in quanto esegue anche una congiunzione logica su due espressioni di Boolean.The AndAlso Operator is very similar to the And operator, in that it also performs logical conjunction on two Boolean expressions. La differenza principale tra i due è che AndAlso presenta un comportamento di corto circuito .The key difference between the two is that AndAlso exhibits short-circuiting behavior. Se la prima espressione in un'espressione AndAlso restituisce False, la seconda espressione non viene valutata perché non è in grado di modificare il risultato finale e AndAlso restituisce False.If the first expression in an AndAlso expression evaluates to False, then the second expression is not evaluated because it cannot alter the final result, and AndAlso returns False.

Analogamente, l' operatore OrElse esegue una disgiunzione logica di corto circuito su due espressioni Boolean.Similarly, the OrElse Operator performs short-circuiting logical disjunction on two Boolean expressions. Se la prima espressione in un'espressione OrElse restituisce True, la seconda espressione non viene valutata perché non è in grado di modificare il risultato finale e OrElse restituisce True.If the first expression in an OrElse expression evaluates to True, then the second expression is not evaluated because it cannot alter the final result, and OrElse returns True.

Compromessi di corto circuitoShort-Circuiting Trade-Offs

Il cortocircuito può migliorare le prestazioni non valutando un'espressione che non può modificare il risultato dell'operazione logica.Short-circuiting can improve performance by not evaluating an expression that cannot alter the result of the logical operation. Tuttavia, se l'espressione esegue azioni aggiuntive, il cortocircuito ignora tali azioni.However, if that expression performs additional actions, short-circuiting skips those actions. Se, ad esempio, l'espressione include una chiamata a una routine Function, tale routine non viene chiamata se l'espressione è di corto circuito e qualsiasi codice aggiuntivo contenuto nell'Function non viene eseguito.For example, if the expression includes a call to a Function procedure, that procedure is not called if the expression is short-circuited, and any additional code contained in the Function does not run. La funzione potrebbe pertanto essere eseguita solo occasionalmente e potrebbe non essere testata correttamente.Therefore, the function might run only occasionally, and might not be tested correctly. In alternativa, la logica del programma potrebbe dipendere dal codice nel Function.Or the program logic might depend on the code in the Function.

Nell'esempio seguente viene illustrata la differenza tra And, Ore le relative controparti di corto circuito.The following example illustrates the difference between And, Or, and their short-circuiting counterparts.

Dim amount As Integer = 12
Dim highestAllowed As Integer = 45
Dim grandTotal As Integer
If amount > highestAllowed And checkIfValid(amount) Then
    ' The preceding statement calls checkIfValid().
End If
If amount > highestAllowed AndAlso checkIfValid(amount) Then
    ' The preceding statement does not call checkIfValid().
End If
If amount < highestAllowed Or checkIfValid(amount) Then
    ' The preceding statement calls checkIfValid().
End If
If amount < highestAllowed OrElse checkIfValid(amount) Then
    ' The preceding statement does not call checkIfValid().
End If
Function checkIfValid(ByVal checkValue As Integer) As Boolean
    If checkValue > 15 Then
        MsgBox(CStr(checkValue) & " is not a valid value.")
        ' The MsgBox warning is not displayed if the call to
        ' checkIfValid() is part of a short-circuited expression.
        Return False
    Else
        grandTotal += checkValue
        ' The grandTotal value is not updated if the call to
        ' checkIfValid() is part of a short-circuited expression.
        Return True
    End If
End Function

Nell'esempio precedente, si noti che il codice importante all'interno checkIfValid() non viene eseguito quando la chiamata è di corto circuito.In the preceding example, note that some important code inside checkIfValid() does not run when the call is short-circuited. La prima istruzione If chiama checkIfValid() anche se 12 > 45 restituisce False, perché And non esegue un corto circuito.The first If statement calls checkIfValid() even though 12 > 45 returns False, because And does not short-circuit. La seconda istruzione If non chiama checkIfValid(), perché quando 12 > 45 restituisce False, AndAlso esegue il cortocircuito della seconda espressione.The second If statement does not call checkIfValid(), because when 12 > 45 returns False, AndAlso short-circuits the second expression. La terza istruzione If chiama checkIfValid() anche se 12 < 45 restituisce True, perché Or non esegue un corto circuito.The third If statement calls checkIfValid() even though 12 < 45 returns True, because Or does not short-circuit. La quarta istruzione If non chiama checkIfValid(), perché quando 12 < 45 restituisce True, OrElse esegue il cortocircuito della seconda espressione.The fourth If statement does not call checkIfValid(), because when 12 < 45 returns True, OrElse short-circuits the second expression.

Operazioni bit per bitBitwise Operations

Le operazioni bit per bit valutano due valori integrali nel form binario (base 2).Bitwise operations evaluate two integral values in binary (base 2) form. Consentono di confrontare i bit nelle posizioni corrispondenti e quindi assegnare i valori in base al confronto.They compare the bits at corresponding positions and then assign values based on the comparison. Nell'esempio seguente viene illustrato l'operatore And.The following example illustrates the And operator.

Dim x As Integer
x = 3 And 5

Nell'esempio precedente il valore di x viene impostato su 1.The preceding example sets the value of x to 1. Ciò si verifica per i motivi seguenti:This happens for the following reasons:

  • I valori vengono considerati binari:The values are treated as binary:

    3 in formato binario = 0113 in binary form = 011

    5 in formato binario = 1015 in binary form = 101

  • L'operatore And Confronta le rappresentazioni binarie, una posizione binaria (bit) alla volta.The And operator compares the binary representations, one binary position (bit) at a time. Se entrambi i bit in una determinata posizione sono pari a 1, il valore 1 viene posizionato in tale posizione nel risultato.If both bits at a given position are 1, then a 1 is placed in that position in the result. Se uno dei due bit è 0, un valore 0 viene posizionato in tale posizione nel risultato.If either bit is 0, then a 0 is placed in that position in the result. Nell'esempio precedente questo approccio funziona come segue:In the preceding example this works out as follows:

    011 (3 in formato binario)011 (3 in binary form)

    101 (5 in formato binario)101 (5 in binary form)

    001 (risultato in formato binario)001 (The result, in binary form)

  • Il risultato viene trattato come decimale.The result is treated as decimal. Il valore 001 è la rappresentazione binaria di 1, quindi x = 1.The value 001 is the binary representation of 1, so x = 1.

L'operazione di Or bit per bit è simile, ad eccezione del fatto che un valore 1 viene assegnato al bit del risultato se uno o entrambi i bit confrontati sono pari a 1.The bitwise Or operation is similar, except that a 1 is assigned to the result bit if either or both of the compared bits is 1. Xor assegna un valore 1 al bit del risultato se esattamente uno dei bit confrontati (non entrambi) è 1.Xor assigns a 1 to the result bit if exactly one of the compared bits (not both) is 1. Not accetta un solo operando e inverte tutti i bit, incluso il bit di segno, e assegna tale valore al risultato.Not takes a single operand and inverts all the bits, including the sign bit, and assigns that value to the result. Ciò significa che per i numeri positivi con segno, Not restituisce sempre un valore negativo e per i numeri negativi Not restituisce sempre un valore positivo o zero.This means that for signed positive numbers, Not always returns a negative value, and for negative numbers, Not always returns a positive or zero value.

Gli operatori AndAlso e OrElse non supportano operazioni bit per bit.The AndAlso and OrElse operators do not support bitwise operations.

Nota

Le operazioni bit per bit possono essere eseguite solo su tipi integrali.Bitwise operations can be performed on integral types only. È necessario convertire i valori a virgola mobile in tipi integrali prima di procedere con un'operazione bit per bit.Floating-point values must be converted to integral types before bitwise operation can proceed.

Vedere ancheSee also