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 solo operando. Algunos de estos operadores también pueden realizar operaciones lógicas bit a bit en valores enteros.

Operador lógico unario

El Not (Operador, Visual Basic) realiza la negación lógica en una expresión Boolean. Produce el contrario 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

El And (Operador, Visual Basic) realiza la conjunción lógica de 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.

El Or (Operador, Visual Basic) realiza la disyunción o inclusión lógicas de dos expresiones Boolean. Si una de las expresiones o ambas se evalúan como True, Or devuelve True. Si ninguna de las expresiones se evalúa como True, Or devuelve False.

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

En el siguiente ejemplo se muestra cómo utilizar 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.

Cortocircuitar las operaciones lógicas

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

De igual forma, el OrElse (Operador) (Visual Basic) realiza la disyunción lógica de evaluación cortocircuitada de dos expresiones Boolean. Si la primera parte de una expresión OrElse se evalúa como True, la segunda parte de la expresión no se evalúa porque no puede modificar el resultado final y OrElse devuelve True.

Inconvenientes de las evaluaciones cortocircuitadas

Cortocircuitar puede mejorar el rendimiento ya que no se evalúa una expresión que no puede modificar el resultado de la operación lógica. Sin embargo, si esa expresión realiza acciones adicionales, al cortocircuitar se pasan por alto 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 se cortocircuita y el código adicional incluido en Function no se ejecuta. Por consiguiente, la función únicamente se puede ejecutar de vez en cuando y no se puede probar correctamente. También, la lógica del programa puede depender del código en la Function.

En el ejemplo siguiente se muestra la diferencia entre And, Or y sus homólogos de evaluación cortocircuitada.

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

En el ejemplo anterior, observe que una parte de código importante dentro de checkIfValid() no se ejecuta cuando se cortocircuita la llamada. La primera instrucción If llama a checkIfValid() aunque 12 > 45 devuelve False, porque And no cortocircuita. 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 cortocircuita. 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, a continuación, asignan valores basados en la comparación. En el siguiente ejemplo se muestra cómo se utiliza el operador And.

Dim x As Integer
x = 3 And 5

En el ejemplo anterior se establece el valor de x en 1. Esto pasa por las siguientes razones:

  • 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) a la vez. Si los dos bits en una posición dada son 1, entonces se coloca un 1 en esa posición del resultado. Si uno de los dos bits es 0, entonces se coloca un 0 en esa posición del resultado. En el ejemplo anterior, esto funciona como sigue:

    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 Or bit a bit es similar, excepto en que se asigna 1 al bit resultante si cualquiera de los bits comparados es 1. Xor asigna 1 al bit del resultado si exclusivamente 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 para números positivos sin signo, Not siempre devuelve un valor negativo y, para números negativos, Not siempre devuelve un valor positivo o cero.

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

Nota

Las operaciones bit a bit sólo se pueden realizar en tipos enteros. Los valores de punto flotante deben convertirse a tipos enteros para que la operación bit a bit pueda proseguir.

Vea también

Referencia

Operadores lógicos y bit a bit (Visual Basic)

Conceptos

Expresiones booleanas (Visual Basic)

Operadores aritméticos en Visual Basic

Operadores de comparación en Visual Basic

Operadores de concatenación en Visual Basic

Combinación eficaz de operadores (Visual Basic)

Historial de cambios

Fecha

Historial

Motivo

Enero de 2011

Se ha modificado la sección Inconvenientes de las evaluaciones cortocircuitadas.

Mejora de la información.