Boolean Array als Integer speichern und wieder auflösen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von dotNETNoob.

    Boolean Array als Integer speichern und wieder auflösen

    Liebe Gemeinde,

    für euch ist folgendes sicher ein Klacks, ich sitze nun schon zwei Tage daran und komme einfach zu keiner vernünftigen Idee. Vielleicht könnt ihr mir ja helfen?:

    Ich weise einem Boolean Array über 8 Checkboxen 8 Werte zu. Bsp: t,t,f,f,f,f,f,f
    Diese Werte sollen nun in einen Integer-Wert umgewandelt werden, als wäre es eine Binärzahl, d.h. für das obige Beispiel:
    true --> 2^0 = 1
    true --> 2^1 = 2
    false --> 0
    false --> 0
    ...
    Resultierender Integer-Wert wäre also 3.

    Dieser Wert wird nun gesichert und später wieder geladen. Hier müsste dann eine "Rückkonvertierung" in ein Boolean Array durchgeführt werden.

    Ich habe schon bitweise Manipulation mit den << und >> Operatoren versucht, jedoch scheint mir das keine saubere Lösung zu sein.

    Vielen Dank für eure liebe Hilfe!
    @dotNETNoob Vielleicht geht das ganz anders. Form mit 8 CheckBoxen, Label. Intererssant ist die Variable Me.AllCheck vom Typ Enum => Integer:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. <Flags>
    3. Private Enum MyCheck
    4. NoCheck = 0
    5. Check1 = 1
    6. Check2 = 2
    7. Check3 = 4
    8. Check4 = 8
    9. Check5 = 16
    10. Check6 = 32
    11. Check7 = 64
    12. Check8 = 128
    13. End Enum
    14. Private AllCheck As MyCheck = MyCheck.NoCheck
    15. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    16. Me.TextCheck(sender, MyCheck.Check1)
    17. End Sub
    18. Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox2.CheckedChanged
    19. Me.TextCheck(sender, MyCheck.Check2)
    20. End Sub
    21. Private Sub CheckBox3_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox3.CheckedChanged
    22. Me.TextCheck(sender, MyCheck.Check3)
    23. End Sub
    24. Private Sub CheckBox4_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox4.CheckedChanged
    25. Me.TextCheck(sender, MyCheck.Check4)
    26. End Sub
    27. Private Sub CheckBox5_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox5.CheckedChanged
    28. Me.TextCheck(sender, MyCheck.Check5)
    29. End Sub
    30. Private Sub CheckBox6_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox6.CheckedChanged
    31. Me.TextCheck(sender, MyCheck.Check6)
    32. End Sub
    33. Private Sub CheckBox7_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox7.CheckedChanged
    34. Me.TextCheck(sender, MyCheck.Check7)
    35. End Sub
    36. Private Sub CheckBox8_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox8.CheckedChanged
    37. Me.TextCheck(sender, MyCheck.Check8)
    38. End Sub
    39. Private Sub TextCheck(sender As Object, value As MyCheck)
    40. Dim cb = DirectCast(sender, CheckBox)
    41. If cb.Checked Then
    42. Me.AllCheck = Me.AllCheck Or value
    43. Else
    44. Me.AllCheck = Me.AllCheck And Not value
    45. End If
    46. Me.Label1.Text = Me.AllCheck.ToString
    47. End Sub
    48. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke! In dieser Richtung habe ich auch schonmal im Form geschaut... Die Eingabe erfolgt zwar über Checkboxen (dafür funktioniert das gut!), dann wird der Integer-Wert aber übertragen. Dort muss er dann in ein einfach abzufragendes Array "übersetzt" werden.

    Es soll geprüft werden ob Option 1,2,3,4,5,6,7,8 True oder False gesetzt wurden, etwa in der Art:
    IF OptionsArray(0) THEN Msgbox("Option 1 ist aktiv")

    Möglich wäre natürlich auch eine Prüfung des Integer-Wertes ob die Option "enthalten" ist per Funktion, aber auch hier fehlt mir die Fantasie :(

    dotNETNoob schrieb:

    "enthalten"
    ist die richtige Herangehensweise:

    VB.NET-Quellcode

    1. If Me.AllCheck.HasFlag(MyCheck.Check1) Then
    2. MessageBox.Show("Check1")
    3. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Als Anregung ein kompilierbares Consolenprogramm:

    VB.NET-Quellcode

    1. Imports System.Console
    2. Module Module1
    3. Sub Main()
    4. Dim bArr(7) As Boolean
    5. Dim l, i As Integer
    6. bArr(0) = 1
    7. bArr(1) = 1
    8. bArr(2) = 0
    9. bArr(3) = 1
    10. bArr(4) = 0
    11. bArr(5) = 1
    12. bArr(6) = 0
    13. bArr(7) = 1
    14. 'IntWert ändern
    15. For i = 0 To 7
    16. If bArr(i) = True Then
    17. l = l Or 2 ^ i
    18. Else
    19. l = l And Not 2 ^ i
    20. End If
    21. Next
    22. WriteLine("Integerwert in Hex: " & l.ToString("X2"))
    23. WriteLine("Integerwert in Bin: " & Convert.ToString(l, 2))
    24. WriteLine()
    25. WriteLine()
    26. ' IntWert lesen
    27. 'l = &H81 'zum Testen anderen Wert eingeben
    28. For i = 0 To 7
    29. If (l And 2 ^ i) = 2 ^ i Then
    30. bArr(i) = 1
    31. Else
    32. bArr(i) = 0
    33. End If
    34. Next
    35. For i = 0 To 7
    36. WriteLine(i.ToString & " - " & bArr(i).ToString)
    37. Next
    38. Read()
    39. End Sub
    40. End Module

    @Eierlein
    Dies wäre jetzt die schlechteste der bisher geposteten Varianten - BitArray, BitVector32 und ein Flags-Enum wären alle deutlich bessere Varianten mit deutlich weniger Code.
    Hallo zusammen! Ich habe es durch eure Hilfe wie folgt lösen können: Ich wandle den Integer-Wert gar nicht mehr in ein Array um, sondern initialisiere ihn einfach mit i=0 und setze dann die Bits je nach CheckBox.Checked. Beim Auslesen prüfe ich dann andersherum ob das Bit im Integer-Wert gesetzt ist. Super einfach, aber ohne eure Denkanstöße schwierig. Also vielen Dank! :)