/ / Bitové operácie - kontrola a odstránenie - vb.net, bitové operátory, bitové a bitové-xor

Bitové operácie - kontrola a odstránenie - vb.net, bitové operátory, bitové a bitové-xor

Všimnite si jednoduchý príklad nižšie:

Module Module1
<Flags>
Public Enum Names
None    = 0
Test    = 1
Test2   = 2
Test3   = 4
Test4   = 8
End Enum

Sub Main()
Dim test As Names = Names.Test Or Names.Test3
If (test And Names.Test3) = Names.Test3
Console.WriteLine("TRUE")
Else
Console.WriteLine("FALSE")
End If
End Sub
End Module

Prvá časť mojej otázky sa týka linky If (test And Names.Test3) = Names.Test3.

Nebolo by lepšie jednoducho skontrolovať If test And Names.Test3 ako keby vlajka existuje? Ak sa vyhodnotí na nenulovú hodnotu (čo znamená, že existuje príznak), potom by výsledok podmienky bol True tak ako tak.

Existuje dobrý dôvod použiť prvý spôsobkontrola nad druhým? (Zatiaľ čo moja odpoveď je pre VB.NET, zaujímalo by ma aj to, či je to potenciálny problém kdekoľvek inde, tj C #, C ++ atď.).

Pokiaľ ide o odstránenie príznakov, zdá sa, že existujú dva spôsoby, ako to urobiť:

test = test Xor Names.Test3 a test = test And Not Names.Test3

Prvý z nich však pridá vlajku, ak je tochýba, a odstrániť, ak je tam, zatiaľ čo druhý odstráni iba. Je to jediný rozdiel? Alebo existuje iný dôvod, prečo by som radšej uprednostnil jednu metódu nad druhou?

odpovede:

3 pre odpoveď č. 1

Máte pravdu v tom, že môžete efektívne nahradiť toto:

If (test And Names.Test3) = Names.Test3 Then

s tým

If (test And Names.Test3) Then

ale, druhý príklad sa nebude kompilovať s Option Strict On ako správne dostanete chybu:

Option Strict On disallows implicit conversions from "Names" to "Boolean" tak aby ste to mohli zostaviť, musíte zabaliť a CBool okolo seba.

Takže na záver by som povedal, že je oveľa lepšie použiť prvý príklad, pretože zámer je veľmi jasný: - kontrolujete, či je nastavený bit.

Pokiaľ ide o odstránenie príznakov, t. J. Zrušenie bitu, mali by ste použiť:

test = test And Not Names.Test3

Použitím Xor má účinok pripínanie hodnota.

Nasledujúce informácie vám môžu pomôcť (najmä ak ich chcete rozšíriť):

Public Function SetBit(ByVal aValue As Names, ByVal aBit As Names) As Names
Return (aValue Or aBit)
End Function

Public Function ClearBit(ByVal aValue As Names, ByVal aBit As Names) As Names
Return (aValue And Not aBit)
End Function

Public Function IsBitSet(ByVal aValue As Names, ByVal aBit As Names) As Boolean
Return ((aValue And aBit) = aBit)
End Function

Public Function ToggleBit(ByVal aValue As Names, ByVal aBit As Names) As Names
Return (aValue Xor aBit)
End Function

2 pre odpoveď č. 2

Zapamätaj si to Flags enums nemusia mať všetky čisto jednobitové hodnoty, napríklad obrázok (s lepšími názvami), že vaše enum bolo:

<Flags>
Public Enum Names
None    = 0
Test    = 1
Test2   = 2
Test3   = 4
Test4   = 8
Test2AndTest4 = 10
End Enum

Teraz by ste to nechceli len otestovať test And Names.Test2AndTest4 je nenulová, pretože to neodpovedá na správnu otázku. Preto je lepšie zvyknúť sa všeobecne dostať sa do And svoju masku skontrolovať a potom porovnať s hodnotou masky, aby ste to zaistili všetko sú nastavené bity masky.