Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

4.3. Logische Bitsgewijze Operatoren

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

De logische operatoren Not, And, Or en Xor kunnen gehele getallen ook "bitgewijs" bewerken.  Deze bitwise operations evalueren de operanden in binaire vorm.
Visual Basic 2012 Broncode - Codevoorbeeld 81
Module LogicalBitwiseOperatorsExample1
    Sub Main()
        Console.WriteLine(7 And 10)
        Console.WriteLine(7 Or 10)
        Console.WriteLine(7 Xor 10)
        '
        Console.WriteLine(7 And Not 7)
        '
        Console.ReadLine()
    End Sub
End Module
Console Application Output
2
15
13
0
De bits op corresponderende posities worden met elkaar vergeleken, en wel op volgende manier :
X     Y      X And Y     X Or Y      X Xor Y      Not X
0     0            0          0            0          1
0     1            0          1            1          1
1     0            0          1            1          0
1     1            1          1            0          0
Dus voor And, Or en Xor :
                            111 And 1010  111 Or 1010  111 Xor 1010
Binary  :   111      1010           0010         1111          1101
Decimal :     7        10              2           15            13
Voor Not :
Decimal : 7
=
            sign bit      value bits
Binary  :   0             000 0000 0000 0000 0000 0000 0000 0111

Not 7
=
            sign bit      value bits
Binary  :   1             111 1111 1111 1111 1111 1111 1111 1000
Decimal : -8

7 And Not 7
Binary :
    0000 0000 0000 0000 0000 0000 0000 0111
And
    1111 1111 1111 1111 1111 1111 1111 1000
=
    0000 0000 0000 0000 0000 0000 0000 0000
Decimal : 0
De AndAlso en OrElse ondersteunen geen bitsgewijze operaties.

Bitsgewijze operaties kunnen enkel worden toegepast op expressies van een numerieke datatypes voor het voorstellen van gehele getallen.

4.3.1. Waarom Logische Bitsgewijze Operatoren Gebruiken

Zelden wordt er in programmas nog gewerkt met data-eenheden die kleiner zijn dan één byte, toch kan het voorvallen dat men individuele bits wil gaan manipuleren.  Om dit te doen kunnen bitwise operations worden gebruikt.

Dit kan zowel gebruikt worden om op nodige geheugenruimte te besparen, als om de performantie te bevorderen.

Stel dat we de toestand van een "tamagotchi" wensen te beheren in een programma.  Bijvoorbeeld de toestanden al dan niet "happy", al dan niet "thirsty", al dan niet "hungry" en al dan niet "tired".

Dan zou men voor elke aparte toestand een variabele kunnen creëren.  Binnen elk van deze variabelen kan dan worden bijgehouden of de tamagotchi zich al dan niet in die specifieke toestand bevindt.

Een alternatief voor het creëren van een variabele per toestand zou erin bestaan de combinatie van de actuele toestanden samen in één variabele onder te brengen.

We zouden deze toestanden als volgt kunnen representeren :
   state :    binary representation :     decimal value :
   "happy"                       0001                   1
"thirsty"                       0010                   2
  "hungry"                       0100                   4
   "tired"                       1000                   8
De decimale waarde 4 bijvoorbeeld, zou dan betekenen dat de tamagotchi "hungry" is.  Niet alleen "hungry" maar ook "niet happy", "niet thirsty" en "niet tired".

Decimale waarde 9 zou dan betekenen dat de toestanden "happy" en "tired" van toepassing zijn, maar ook "niet thirsty" en "niet hungry".
Visual Basic 2012 Broncode - Codevoorbeeld 82
Module LogicalBitwiseOperatorsExample2
    Sub Main()
        Dim tamagotchiState As Integer = 5
        ' ...
        If (tamagotchiState And 1) = 1 Then Console.WriteLine("happy")
        If (tamagotchiState And 2) = 2 Then Console.WriteLine("thirsty")
        If (tamagotchiState And 4) = 4 Then Console.WriteLine("hungry") '    (1)
        If (tamagotchiState And 8) = 8 Then Console.WriteLine("tired")
        Console.WriteLine()
        '
        Console.WriteLine("making tamagotchi not hungry ...")
        tamagotchiState = tamagotchiState And Not 4                        ' (2)
        Console.WriteLine()
        '
        If (tamagotchiState And 1) = 1 Then Console.WriteLine("happy")
        If (tamagotchiState And 2) = 2 Then Console.WriteLine("thirsty")
        If (tamagotchiState And 4) = 4 Then Console.WriteLine("hungry")
        If (tamagotchiState And 8) = 8 Then Console.WriteLine("tired")
        Console.WriteLine()
        '
        Console.WriteLine("making tamagotchi thirsty ...")
        tamagotchiState = tamagotchiState Or 2                             ' (3)
        Console.WriteLine()
        '
        If (tamagotchiState And 1) = 1 Then Console.WriteLine("happy")
        If (tamagotchiState And 2) = 2 Then Console.WriteLine("thirsty")
        If (tamagotchiState And 4) = 4 Then Console.WriteLine("hungry")
        If (tamagotchiState And 8) = 8 Then Console.WriteLine("tired")
        Console.WriteLine()
        '
        Console.WriteLine("making tamagotchi happy, hungry and tired ...")
        tamagotchiState = tamagotchiState Or 1 Or 4 Or 8
        Console.WriteLine()
        '
        If (tamagotchiState And 1) = 1 Then Console.WriteLine("happy")
        If (tamagotchiState And 2) = 2 Then Console.WriteLine("thirsty")
        If (tamagotchiState And 4) = 4 Then Console.WriteLine("hungry")
        If (tamagotchiState And 8) = 8 Then Console.WriteLine("tired")
        Console.WriteLine()
        '
        Console.WriteLine("making tamagotchi not hungry and not tired ...")
        tamagotchiState = tamagotchiState And Not 4 And Not 8
        Console.WriteLine()
        '
        If (tamagotchiState And 1) = 1 Then Console.WriteLine("happy")
        If (tamagotchiState And 2) = 2 Then Console.WriteLine("thirsty")
        If (tamagotchiState And 4) = 4 Then Console.WriteLine("hungry")
        If (tamagotchiState And 8) = 8 Then Console.WriteLine("tired")
        Console.WriteLine()
        '
        Console.WriteLine("inverting states ...")
        tamagotchiState = Not tamagotchiState
        Console.WriteLine()
        '
        If (tamagotchiState And 1) = 1 Then Console.WriteLine("happy")
        If (tamagotchiState And 2) = 2 Then Console.WriteLine("thirsty")
        If (tamagotchiState And 4) = 4 Then Console.WriteLine("hungry")
        If (tamagotchiState And 8) = 8 Then Console.WriteLine("tired")
        '
        Console.ReadLine()
    End Sub
End Module
Aan de hand van de And operator kunnen we nu nagaan of de tamagotchi zich in een bepaalde toestand bevindt (1).

De expressie tamagotchiState And 4 zal enkel evalueren naar 4 indien de derde bit van rechts in de waarde van tamagotchiState op 1 staat.

Dus (tamagotchiState And 4) = 4 zal enkel True zijn indien de tamagotchi zich in deze toestand bevindt.

In het algemeen kun je stellen :
If (tamagochiState And state) = state Then
    ... tamagochi is in state ...
Else
    ... tamagochi is not in state ...
End If
Bijvoorbeeld in bovenstaand geval (1) :
tamagotchiState    5       0101
                                  And
"hungry"           4       0100
                                  =
                           0100
De tamagotchi bevindt zich dus in de toestand "hungry".

Waaruit in bovenstaand voorbeeld wordt besloten om hem eten te geven (en hem dus uit de "hungry" toestand te halen).  Door de tamagotchiState te combineren met Not "hungry" kan dit bekomen worden (2).  Losstaand van het feit of deze nu al "hungry" is of niet, het resultaat zal steeds not "hungry" inhouden :
"hungry" = 4 = 0100 -> Not 4 = Not 0100 = 1011
'tamagotchiState' "not hungry" = 0000 -> 0000 And 1011 = 0000 ("not hungry")
'tamagotchiState'     "hungry" = 0100 -> 0100 And 1011 = 0000 ("not hungry")
Stel dat we de tamagotchi "thirsty" willen maken, losstaand van het feit of deze nu al "thirsty" is of niet, dan kunnen we niet zomaar stellen :
tamagotchiState += 2
Want bijvoorbeeld tamagotchiState 2 vermeerderd met 2 geeft 4 (of "hungry" en dus "niet thirsty").

Wat we wel kunnen doen in dergelijke situatie is (3) :
tamagotchiState = tamagotchiState Or 2
Hierbij zal immers steeds het resultaat "thirsty" inhouden :
"thirsty" = 2 = 0010
'tamagotchiState' "not thirsty" = 0000 -> 0000 Or 0010 = 0010 ("thirsty")
'tamagotchiState'     "thirsty" = 0010 -> 0010 Or 0010 = 0010 ("thirsty")

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.