Opérateurs de bits et opérateurs logiques en Visual Basic

Les opérateurs logiques comparent les expressions Boolean et renvoient un résultat Boolean. Les opérateurs And, Or, AndAlso, OrElse et Xor sont binaires, car ils prennent deux opérandes, tandis que l’opérateur Not est unaire, car il prend un seul opérande. Certains de ces opérateurs peuvent également effectuer des opérations logiques au niveau du bit sur des valeurs intégrales.

Opérateur logique unaire

L’Opérateur Not effectue une négation logique sur une expression Boolean. Il produit le contraire logique de son opérande. Si l’expression correspond à la valeur True, Not renvoie False ; si l’expression correspond à la valeur False, Not renvoie True. L'exemple suivant illustre ce comportement.

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

Opérateurs logiques binaires

L’Opérateur And effectue une conjonction logique sur deux expressions Boolean. Si les deux expressions donnent True, And renvoie True. Si au moins une des expressions donne False, And renvoie False.

L’Opérateur Or effectue une disjonction ou une inclusion logiques sur deux expressions Boolean. Si l’une ou l’autre expression donne True, ou si les deux donnent True, Or renvoie True. Si aucune expression ne donne True, Or retourne False.

L’Opérateur Xor effectue une exclusion logique sur deux expressions Boolean. Si exactement une expression donne True, mais pas les deux, Xor renvoie True. Si les deux expressions donnent True ou que les deux donnentFalse, Xor renvoie False.

L’exemple suivant illustre les opérateurs And, Or et 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.

Opérations logiques de court-circuit

L’Opérateur AndAlso est très similaire à l’opérateur And, car il effectue également une conjonction logique sur deux expressions Boolean. La principale différence entre les deux est que AndAlso présente un comportement de court-circuit. Si la première expression d’une expression AndAlso donne False, la deuxième expression n’est pas évaluée, car elle ne peut pas modifier le résultat final, et AndAlso renvoie False.

De même, l’Opérateur OrElse effectue une disjonction logique de court-circuit sur deux expressions Boolean. Si la première expression d’une expression OrElse donne True, la deuxième expression n’est pas évaluée, car elle ne peut pas modifier le résultat final, et OrElse renvoie True.

Compromis de court-circuitage

Le court-circuitage peut améliorer les performances en n’évaluant pas une expression qui ne peut pas modifier le résultat de l’opération logique. Toutefois, si cette expression effectue des actions supplémentaires, le court-circuitage ignore ces actions. Par exemple, si l’expression inclut un appel à une procédure Function, cette procédure n’est pas appelée si l’expression est court-circuitée, et tout code supplémentaire contenu dans le Function ne s’exécute pas. Par conséquent, la fonction peut n'être exécutée qu'occasionnellement et ne pas être testée correctement. Ou la logique du programme peut dépendre du code dans le Function.

L’exemple suivant illustre la différence entre And, Or, et leurs équivalents de court-circuit.

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

Dans l’exemple précédent, notez que le code important à l’intérieur de checkIfValid() ne s’exécute pas lorsque l’appel est court-circuité. La première instruction If appelle checkIfValid() même si 12 > 45 renvoie False, car And ne court-circuite pas. La deuxième instruction If n’appelle pas checkIfValid(), car quand 12 > 45 renvoie False, AndAlso court-circuite la deuxième expression. La troisième instruction If appelle checkIfValid() même si 12 < 45 renvoie True, car Or ne court-circuite pas. La quatrième instruction If n’appelle pas checkIfValid(), car quand 12 < 45 renvoie True, OrElse court-circuite la deuxième expression.

Opérations au niveau du bit

Les opérations au niveau du bit évaluent deux valeurs intégrales sous forme binaire (base 2). Ils comparent les bits aux positions correspondantes, puis attribuent des valeurs en fonction de la comparaison. L'exemple ci-dessous illustre l’opérateur And.

Dim x As Integer
x = 3 And 5

L’exemple précédent définit la valeur x sur 1. Cela se produit pour les raisons suivantes :

  • Les valeurs sont traitées comme binaires :

    3 sous forme binaire = 011

    5 sous forme binaire = 101

  • L’opérateur And compare les représentations binaires, une position binaire (bit) à la fois. Si les deux bits à une position donnée sont 1, un 1 est placé dans cette position dans le résultat. Si l’un ou l’autre bit est 0, un 0 est placé dans cette position dans le résultat. Dans l’exemple précédent, cela fonctionne comme suit :

    011 (3 sous forme binaire)

    101 (5 sous forme binaire)

    001 (Le résultat, sous forme binaire)

  • Le résultat est traité comme décimal. La valeur 001 est la représentation binaire de 1, de sorte que x = 1.

L’opération Or au niveau du bit est similaire, sauf qu’un 1 est attribué au bit de résultat si l'un ou l'autre des bits comparés, ou les deux, est égal à 1. Xor attribue un 1 au bit de résultat si exactement l’un des bits comparés (pas les deux) est 1. Not prend un opérande unique et inverse tous les bits, y compris le bit de signe, et attribue cette valeur au résultat. Cela signifie que pour les nombres positifs signés, Not renvoie toujours une valeur négative et pour les nombres négatifs, Not renvoie toujours une valeur positive ou nulle.

Les opérateurs AndAlso et OrElse les opérateurs ne prennent pas en charge les opérations au niveau du bit.

Notes

Les opérations au niveau du bit peuvent être effectuées uniquement sur les types intégraux. Les valeurs à virgule flottante doivent être converties en types intégraux avant que l’opération au niveau du bit puisse continuer.

Voir aussi