Operadores lógicos y bit a bit en Visual Basic

Los operadores lógicos comparan expresiones Boolean y devuelven un resultado Boolean. Los operadores And, Or, AndAlso, OrElse y Xor son binarios porque toman dos operandos, mientras que el operador Not es unario porque toma un único operando. Algunos de estos operadores también pueden realizar operaciones lógicas bit a bit en valores enteros.

Operador lógico unario

Not (Operador) realiza una negación lógica en una expresión Boolean. Genera el opuesto lógico de su operando. Si la expresión se evalúa como True, Not devuelve False; si la expresión se evalúa como False, Not devuelve True. Esto se ilustra en el siguiente ejemplo:

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

Operadores lógicos binarios

And (Operador) realiza una conjunción lógica en dos expresiones Boolean. Si ambas expresiones se evalúan como True, And devuelve True. Si al menos una de las expresiones se evalúa como False, And devuelve False.

Or (Operador) realiza una disyunción o inclusión lógica en dos expresiones Boolean. Si cualquiera de las expresiones se evalúa como True, o ambas se evalúan como True, Or devuelve True. Si ninguna expresión se evalúa como True, Or devuelve False.

Xor (Operador) realiza una exclusión lógica en dos expresiones Boolean. Si exactamente una expresión se evalúa como True, pero no ambas, Xor devuelve True. Si ambas expresiones se evalúan como True, o ambas se evalúan como False, Xor devuelve False.

En el ejemplo siguiente se muestran los operadores And, Or y Xor.

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.

Cortocircuito de operaciones lógicas

AndAlso (Operador) es muy similar al operador And, ya que también realiza una conjunción lógica en dos expresiones Boolean. La diferencia clave entre los dos es que AndAlso exhibe un comportamiento de cortocircuito. Si la primera expresión de una expresión AndAlso se evalúa como False, la segunda expresión no se evalúa porque no puede modificar el resultado final y AndAlso devuelve False.

Del mismo modo, OrElse (Operador) realiza una disyunción lógica de cortocircuito en dos expresiones Boolean. Si la primera expresión de una expresión OrElse se evalúa como True, la segunda expresión no se evalúa porque no puede modificar el resultado final y OrElse devuelve True.

Ventajas y desventajas del cortocircuito

El cortocircuito puede mejorar el rendimiento al no evaluar una expresión que no puede modificar el resultado de la operación lógica. Pero si esa expresión realiza acciones adicionales, el cortocircuito omite esas acciones. Por ejemplo, si la expresión incluye una llamada a un procedimiento Function, no se llama a ese procedimiento si la expresión está cortocircuitada, y no se ejecuta ningún código adicional incluido en Function. Por lo tanto, la función solo se puede ejecutar ocasionalmente, y podría no probarse correctamente. O bien, la lógica del programa puede depender del código de Function.

En el ejemplo siguiente se muestra la diferencia entre And, Or y sus equivalentes de cortocircuito.

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

Observe que en el ejemplo anterior no se ejecuta algún código importante dentro de checkIfValid() si la llamada está cortocircuitada. La primera instrucción If llama a checkIfValid() aunque 12 > 45 devuelve False, porque And no está cortocircuitada. La segunda instrucción If no llama a checkIfValid(), porque cuando 12 > 45 devuelve False, AndAlso cortocircuita la segunda expresión. La tercera instrucción If llama a checkIfValid() aunque 12 < 45 devuelve True, porque Or no está cortocircuitada. La cuarta instrucción If no llama a checkIfValid(), porque cuando 12 < 45 devuelve True, OrElse cortocircuita la segunda expresión.

Operaciones bit a bit

Las operaciones bit a bit evalúan dos valores enteros en formato binario (base 2). Comparan los bits en las posiciones correspondientes y luego asignan valores en función de la comparación. En el ejemplo siguiente se muestra el operador And.

Dim x As Integer
x = 3 And 5

En el ejemplo anterior se establece el valor de x en 1. Esto sucede por los motivos siguientes:

  • Los valores se tratan como binarios:

    3 en formato binario = 011

    5 en formato binario = 101

  • El operador And compara las representaciones binarias, una posición binaria (bit) cada vez. Si ambos bits en una posición determinada son 1, se coloca un 1 en esa posición en el resultado. Si cualquiera de los bits es 0, se coloca un 0 en esa posición en el resultado. En el ejemplo anterior, esto resulta en lo siguiente:

    011 (3 en formato binario)

    101 (5 en formato binario)

    001 (El resultado, en formato binario)

  • El resultado se trata como decimal. El valor 001 es la representación binaria de 1, por lo que x = 1.

La operación bit a bit Or es similar, salvo que se asigna un 1 al bit de resultado si uno de los bits comparados, o ambos, son 1. Xor asigna un 1 al bit de resultado si exactamente uno de los bits comparados (no ambos) es 1. Not toma un solo operando e invierte todos los bits, incluido el bit de signo, y asigna ese valor al resultado. Esto significa que, en los números positivos con signo, Not siempre devuelve un valor negativo y, en los números negativos, Not siempre devuelve un valor positivo o cero.

Los operadores AndAlso y OrElse no admiten operaciones bit a bit.

Nota

Las operaciones bit a bit solo se pueden realizar en tipos enteros. Los valores de punto flotante se deben convertir en tipos enteros para continuar con la operación bit a bit.

Consulte también