Compartir a través de


Operadores lógicos y bit a bit en Visual Basic

Los operadores lógicos comparan Boolean expresiones y devuelven un Boolean resultado. Los Andoperadores , Or, AndAlso, OrElsey Xor son binarios porque toman dos operandos, mientras que el Not operador 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

El operador "Not" realiza la negación lógica en una Boolean expresión. Produce lo contrario lógico de su operando. Si la expresión se evalúa como True, devuelve NotFalse; 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 operador And realiza una combinación lógica en dos Boolean expresiones. Si ambas expresiones se evalúan como True, entonces And devuelve True. Si al menos una de las expresiones se evalúa como False, And devuelve False.

El operador Or realiza la disjunción lógica o la inclusión en dos Boolean expresiones. Si cualquiera de las expresiones se evalúa como True, o ambas se evalúan como True, devuelve OrTrue. Si ninguna expresión se evalúa como True, Or devuelve False.

El operador Xor realiza la exclusión lógica en dos Boolean expresiones. 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 ilustran los And, Or y Xor operadores.

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

El operador AndAlso es muy similar al And operador , en que también realiza la conjunción lógica en dos Boolean expresiones. La diferencia clave entre los dos es que AndAlso presenta un comportamiento de cortocircuito. Si la primera expresión de una AndAlso expresión 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 OrElse expresión 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 Function procedimiento, no se llama a ese procedimiento si la expresión está cortocircuitada y no se ejecuta ningún código adicional contenido en .Function Por lo tanto, la función solo se puede ejecutar ocasionalmente y es posible que no se pruebe correctamente. O bien, la lógica del programa puede depender del código en el 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 If instrucción 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 If instrucción no llama a checkIfValid(), porque cuando 12 < 45 devuelve True, OrElse cortocircuita la segunda expresión.

Operaciones a nivel de bits

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 en función de la comparación. En el ejemplo siguiente se muestra el And operador .

Dim x As Integer
x = 3 And 5

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

  • Los valores se tratan como binarios:

    3 en formato binario = 011

    5 en formato binario = 101

  • El And operador compara las representaciones binarias, una posición binaria (bit) a la 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 funciona de la siguiente manera:

    011 (3 en formato binario)

    101 (5 en formato binario)

    001 (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 o ambos de los bits comparados es 1. Xor asigna un 1 al bit de resultado si exactamente uno de los bits comparados (no ambos) es 1. Not toma un único operando e invierte todos los bits, incluido el bit de signo, y asigna ese valor al resultado. Esto significa que, para los números positivos firmados, Not siempre devuelve un valor negativo y, para 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 deben convertirse en tipos enteros antes de que la operación bit a bit pueda continuar.

Consulte también