Boolean Array

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    Boolean Array

    Hallo.

    Ich habe mir so ein Boolean Array erstellt.
    Dim Stuff(32) As Boolean.
    Hat also 32 Plätze.
    Und ich möchte mir alle möglichen Kombinationen von true und false ausgeben. Sollten 32 sein (2^5).
    Ich bin mir aber sicher wie ich das machen soll.
    Also alle möglichen Kombinationen. Jede Kombination besteht ja aus 5 Bool Werten.
    Also z.B.

    True, true, true, true, true
    Oder
    False, true, true, true, true

    Wie gebe ich mir da alle Möglichkeiten aus?
    C# Developer
    Learning C++
    Hi
    da fallen mir mehrere Dinge zu ein:
    1. Das Array hat 33 Plätze
    2. Ginge das schöner mit einem BitArray
    3. Könntest du auch ein UInteger hochzählen und die Bits extrahieren und anschließend in das Array kopieren, sofern das noch nötig ist:

    VB.NET-Quellcode

    1. Dim i As UInteger = 0
    2. Dim combination As New BitArray(5)
    3. Do
    4. For j As Integer = 0 To 31
    5. combination(i) = ((j >> i) & 1) <> 0
    6. Next
    7. 'combination enthält die Bitkombination
    8. If i < UInteger.MaxValue Then
    9. i+=1
    10. Else
    11. Exit Do
    12. End If
    13. Loop


    Gruß
    ~blaze~
    *Vollzitat entfernt*


    Danke für deine schnelle antwort, allerdings habe ich folgendes Problem, wenn ich mir die Werte in ner ListBox ausgeben lassen möchte:




    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim i As UInteger = 0
    3. Dim combination As New BitArray(5)
    4. Do
    5. For j As Integer = 0 To 31
    6. combination(i) = ((j >> i) + 1) <> 0
    7. For t As Integer = 0 To 4
    8. ListBox1.Items.Add(combination(0).ToString & "," & combination(1).ToString & combination(2).ToString & combination(3).ToString & combination(4).ToString)
    9. Next
    10. Next
    11. 'combination enthält die Bitkombination
    12. If i < UInteger.MaxValue Then
    13. i += 1
    14. Else
    15. Exit Do
    16. End If
    17. Loop
    18. End Sub


    Edit by ~blaze~:
    *Vollzitat entfernt*
    C# Developer
    Learning C++

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    Sorry, aber da sieht man ja sofort, was nicht stimmt.
    Was sagt dir die Ausnahme denn? Der Index ist ausserhalb der gültigen Bereichs; Der Index darf nicht negativ sein und darf auch nicht grösser sein, als die Grösse der Collection.
    -> Wie gross ist das BitArray und was für einen Index hast du abfragen wollen? Eben... ^^
    *Vollzitat entfernt*

    Higlav schrieb:

    Sorry, aber da sieht man ja sofort, was nicht stimmt.
    Was sagt dir die Ausnahme denn? Der Index ist ausserhalb der gültigen Bereichs; Der Index darf nicht negativ sein und darf auch nicht grösser sein, als die Grösse der Collection.
    -> Wie gross ist das BitArray und was für einen Index hast du abfragen wollen? Eben... ^^


    Ist das wirklich so offensichtlich? Ich sehe den Fehler irgendwie nicht. Ich geh von 0 bis 32, also ale 32 möglichkeiten durch, und das BitArray ist 5 groß... Hnn..?!

    Edit by ~blaze~:
    *Vollzitat entfernt*
    C# Developer
    Learning C++

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „~blaze~“ ()

    Warum Vollzitate?
    Du zählst i von 0 bis UInteger.MaxValue hoch und fragst mit dem Index i den Wert eines BitArrays ab, das nur Inizes von 0 bis 5 hat. Heisst, wenn dein i grösser als 5 ist, fragst du einen nichtexistenten Index ab, was die ArgumentOutOfRangeException auslöst.
    Ok, sorry, diesmal hab' ich echt Mist gebaut. :D Bin jetzt zu faul, die lange Entschuldigung/Ausrede zu schreiben, deswegen kriegst du einfach noch einen Code des Meisters:

    Visual Basic-Quellcode

    1. Dim len As Integer = 5
    2. Dim combination As New BitArray(len)
    3. For i As Integer = 0 To (1 << len) - 1
    4. For j As Integer = 0 To len - 1
    5. combination(j) = ((i >> j) And 1) <> 0
    6. Next
    7. 'combination enthält die Bitkombination
    8. Debug.Print(String.Concat(combination.Cast(Of Boolean)().Select(Function(p) If(p, "1", "0"))))
    9. Next


    Gruß
    ~blaze~
    *Vollzitat entfernt*

    Danke :)
    Aber wie wäre die korrekte ausgabe, ich arbeite nicht oft mit linq deswegen macht mir das etwas probleme.
    Bei mir gibt er (collection) aus wenn ich es so versuche :



    Ich würde die Items jedoch gerne also true,true,false,false,true oder eben 1,1,0,0,1 oder so ausgeben ^^
    Edit by ~blaze~:
    *Vollzitat entfernt*
    C# Developer
    Learning C++

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    Es braucht kein Vollzitat, wenn der Beitrag, auf den du dich beziehst gleich darüber zu finden ist. ;)

    Schalte bei dir mal Option Strict ein. Und übergib der .Add()-Methode den zusammengefügten String.
    Sorry, schieb da noch ein .ToList dazwischen:

    VB.NET-Quellcode

    1. String.Join("|", combination.Cast(Of Boolean).ToList.ConvertAll(Function(p) If(p, "1", "0")))



    Und diese

    Rikudo schrieb:

    Linq geschichte
    Ist einfach zu verstehen: Jede Funktion erstellt eine neue Liste aus der Alten mit verschiedenen Effekten:
    1. String.Join() verkettet eine generische Liste(, die IEnumerable(Of T) implementiert) mit dem angegebenen Trennstring.
    2. IEnumerable.Cast(Of TResult) erstellt aus der altmodischen IEnumerable-implementierenden Liste eine generische IEnumerable(Of T).
    3. IEnumerable(Of T).ToList() erstellt aus der Instanz der Schnittstelle IEnumerable(Of T) eine List(Of T).
    4. List(Of T).ConvertAll() erstellt aus der Instanz der List(Of Boolean) eine List(Of String), welche ja IEnumerable(Of T) implementiert, weshalb die Join-Methode funktioniert.


    EDIT: War ja klar, dass ich zu langsam bin. :rolleyes:
    Danke erstmal für deine erklärung, jetzt verstehe ich die "linq-geschichte" schon ein bisschen mehr ;)

    Allerdings, will das ganze imme rnoch nicht so richtig.
    Bei deiner Methode:

    VB.NET-Quellcode

    1. Dim len As Integer = 5
    2. Dim combination As New BitArray(len)
    3. For i As Integer = 0 To (1 << len) - 1
    4. For j As Integer = 0 To len - 1
    5. combination(j) = ((i >> j) And 1) <> 0
    6. Next
    7. 'combination enthält die Bitkombination
    8. ListBox1.Items.Add(String.Join("|", combination.Cast(Of Boolean).ToList.ConvertAll(Function(p) If(p, "1", "0"))))
    9. Next


    Meldet er immer noch:




    Edit:

    Ah, jetzt habe ich es, ich muss noch ein .toarray anfügen, nach der drittletzten klammer.


    C# Developer
    Learning C++
    Ich will ja nichts sagen. Aber NUR um alle Kombinationen anzuzeigen, tut's auch ein 3 Zeiler

    VB.NET-Quellcode

    1. Private Sub Doit()
    2. For i As Long = 0 To 2 ^ 5 - 1
    3. ListBox1.Items.Add(Convert.ToString(i, 2))
    4. Next
    5. End Sub


    wenn man will. kann man auch noch schön auf 5 Stellen ausgleichen.

    ts ts ts.. man muss ja nicht alles gleich so kompliziert machen.