Delen via


Logische en bitwise operators in Visual Basic

Logische operators vergelijken Boolean expressies en retourneren een Boolean resultaat. De Andoperatoren , Or, AndAlsoen XorOrElseoperators zijn binair omdat ze twee operanden nemen, terwijl de Not operator unaire is omdat er één operand nodig is. Sommige van deze operators kunnen ook bitwise logische bewerkingen uitvoeren op integrale waarden.

Unary Logical Operator

De operator Not voert logische negatie uit op een Boolean expressie. Het levert het logische tegenovergestelde van de operand op. Als de expressie resulteert in True, retourneert NotFalsedeze ; als de expressie resulteert Falsein , Not retourneert Truede expressie . In het volgende voorbeeld ziet u dit.

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

Binaire logische operators

De and-operator voert logische combinaties uit op twee Boolean expressies. Als beide expressies worden geëvalueerdTrue, retourneert Trueu .And Als ten minste één van de expressies resulteert Falsein , And retourneert False.

De operator Of voert logische disjunction of insluiting uit op twee Boolean expressies. Als een van beide expressies Trueresulteert in , of beide evalueren True, wordt dan Or geretourneerd True. Als geen van beide expressies TrueFalsewordt geëvalueerd, Or wordt het resultaat geretourneerd.

De Xor-operator voert logische uitsluiting uit op twee Boolean expressies. Als precies één expressie resulteert in True, maar niet beide, Xor retourneert True. Als beide expressies worden geëvalueerd True of beide worden geëvalueerd False, Xor wordt geretourneerd False.

In het volgende voorbeeld ziet u de Andoperatoren , Oren Xor de operatoren.

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.

Logische bewerkingen kortsluiten

De AndAlso-operator is vergelijkbaar met de And operator, omdat deze ook logische combinaties uitvoert op twee Boolean expressies. Het belangrijkste verschil tussen de twee is dat AndAlso kortsluitingsgedrag vertoont. Als de eerste expressie in een AndAlso expressie wordt geëvalueerd False, wordt de tweede expressie niet geëvalueerd omdat het uiteindelijke resultaat niet kan worden gewijzigd en AndAlso wordt geretourneerd False.

Op dezelfde manier voert de OrElse-operator een logische scheiding van kortsluiting uit op twee Boolean expressies. Als de eerste expressie in een OrElse expressie wordt geëvalueerd True, wordt de tweede expressie niet geëvalueerd omdat het uiteindelijke resultaat niet kan worden gewijzigd en OrElse wordt geretourneerd True.

Kortsluitingsonderingen

Kortsluiting kan de prestaties verbeteren door geen expressie te evalueren die het resultaat van de logische bewerking niet kan wijzigen. Als deze expressie echter aanvullende acties uitvoert, slaat kortsluiting deze acties over. Als de expressie bijvoorbeeld een aanroep naar een Function procedure bevat, wordt deze procedure niet aangeroepen als de expressie kortsluiting heeft en eventuele aanvullende code in de Function expressie niet wordt uitgevoerd. Daarom kan de functie slechts af en toe worden uitgevoerd en wordt deze mogelijk niet correct getest. Of de programmalogica kan afhankelijk zijn van de code in de Function.

In het volgende voorbeeld ziet u het verschil tussen And, Oren hun tegenhangers voor kortsluiting.

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

Houd er in het voorgaande voorbeeld rekening mee dat een aantal belangrijke code binnen checkIfValid() niet wordt uitgevoerd wanneer de aanroep kortsluiting heeft. De eerste If instructie roept aan, ook al 12 > 45 retourneert checkIfValid()False, omdat And er geen kortsluiting is. De tweede If instructie roept geen aan, checkIfValid()omdat bij 12 > 45 retourneert, AndAlso de tweede expressie kortcircuitsFalse. De derde If instructie roept aan, ook al 12 < 45 retourneert checkIfValid()True, omdat Or er geen kortsluiting is. De vierde If instructie roept geen aanroep checkIfValid(), omdat bij 12 < 45 retourneert True, OrElse de tweede expressie kortsluitingen.

Bitsgewijze bewerkingen

Bitwise-bewerkingen evalueren twee integrale waarden in binaire vorm (basis 2). Ze vergelijken de bits op overeenkomende posities en wijzen vervolgens waarden toe op basis van de vergelijking. In het volgende voorbeeld ziet u de And operator.

Dim x As Integer
x = 3 And 5

In het voorgaande voorbeeld wordt de waarde van x 1 ingesteld. Dit gebeurt om de volgende redenen:

  • De waarden worden behandeld als binair:

    3 in binaire vorm = 011

    5 in binaire vorm = 101

  • De And operator vergelijkt de binaire weergaven, één binaire positie (bit) tegelijk. Als beide bits op een bepaalde positie 1 zijn, wordt een 1 in die positie in het resultaat geplaatst. Als een van beide bits 0 is, wordt er een 0 in die positie in het resultaat geplaatst. In het voorgaande voorbeeld werkt dit als volgt:

    011 (3 in binaire vorm)

    101 (5 in binaire vorm)

    001 (het resultaat, in binaire vorm)

  • Het resultaat wordt behandeld als decimaal. De waarde 001 is de binaire weergave van 1, dus x = 1.

De bitsgewijze Or bewerking is vergelijkbaar, behalve dat een 1 is toegewezen aan de resultaatbit als een van de vergeleken bits 1 is. Xor wijst een 1 toe aan de resultaatbit als precies één van de vergeleken bits (niet beide) 1 is. Not gebruikt één operand en zet alle bits om, inclusief de teken-bit, en wijst die waarde toe aan het resultaat. Dit betekent dat voor ondertekende positieve getallen Not altijd een negatieve waarde wordt geretourneerd en voor negatieve getallen Not altijd een positieve of nulwaarde wordt geretourneerd.

De AndAlso en OrElse operators bieden geen ondersteuning voor bitsgewijze bewerkingen.

Notitie

Bitwise-bewerkingen kunnen alleen worden uitgevoerd op integrale typen. Waarden voor drijvende komma moeten worden geconverteerd naar integrale typen voordat bitgewijze bewerkingen kunnen worden voortgezet.

Zie ook