XOR mit 3 Eingängen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    @WhitePage
    Hab ich wohl übersehen ^^ .

    @TE
    Hier ist noch eine etwas schnellere version von deinem Code:

    VB.NET-Quellcode

    1. Private Function MultiXor(ParamArray bools As Boolean())
    2. Dim flag As Boolean
    3. For Each b In bools
    4. If b Then
    5. If flag Then Return False
    6. flag = True
    7. End If
    8. Next
    9. Return flag
    10. End Function
    Ja habe ich jetzt getestet - aber konnte da jetzt nicht wesentlich schnelleres feststellen können...

    Spoiler anzeigen
    Kurzversion:
    0 0 0 0 False
    0 0 0 1 True
    0 0 1 0 True
    0 0 1 1 False
    0 1 0 0 True
    0 1 0 1 False
    0 1 1 0 False
    0 1 1 1 False
    1 0 0 0 True
    1 0 0 1 False
    1 0 1 0 False
    1 0 1 1 False
    1 1 0 0 False
    1 1 0 1 False
    1 1 1 0 False
    1 1 1 1 False
    Dauer...2861

    Meine optimierte Schleife:
    0 0 0 0 False
    0 0 0 1 True
    0 0 1 0 True
    0 0 1 1 False
    0 1 0 0 True
    0 1 0 1 False
    0 1 1 0 False
    0 1 1 1 False
    1 0 0 0 True
    1 0 0 1 False
    1 0 1 0 False
    1 0 1 1 False
    1 1 0 0 False
    1 1 0 1 False
    1 1 1 0 False
    1 1 1 1 False
    Dauer...1067

    Deine optimierte Schleife:
    0 0 0 0 False
    0 0 0 1 True
    0 0 1 0 True
    0 0 1 1 False
    0 1 0 0 True
    0 1 0 1 False
    0 1 1 0 False
    0 1 1 1 False
    1 0 0 0 True
    1 0 0 1 False
    1 0 1 0 False
    1 0 1 1 False
    1 1 0 0 False
    1 1 0 1 False
    1 1 1 0 False
    1 1 1 1 False
    Dauer...917

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

    Geht es denn immer um 3 Eingänge? Wenn ich eine Formel nach Post #9 aufstelle, komme ich auf diese Funktion:

    Visual Basic-Quellcode

    1. Private Function IsOneParamTrue(A As Boolean, B As Boolean, C As Boolean) As Boolean
    2. Return Not A And (B Xor C) OrElse A And Not B And Not C
    3. End Function

    Da diese nur aus booleschen Operationen besteht, sollte sie deutlich schneller sein als eine Schleife (nicht getestet). Der Nachteil ist, dass sie nur für 3 Parameter gilt. Für 4 oder mehr muss eine neue Formel bestimmt werden.

    Spoiler anzeigen

    Das geht mit einem KV-Diagramm.
    Gruß
    hal2000
    Danke für diesen Hinweis - das KV-Diagramm hatte ich vor Ewigkeiten noch ganz leicht in Erinnerung! :)
    Ja, es werden leider Eingänge in verschiedener Anzahl erwartet...
    Ich habe jetzt ein Schema mit verschiedenen Überladungen entwickelt:

    VB.NET-Quellcode

    1. Function OutputX(E1 As Boolean, E2 As Boolean) As Boolean
    2. Return E1 Xor E2
    3. End Function
    4. Function OutputX(E1 As Boolean, E2 As Boolean, E3 As Boolean) As Boolean
    5. Return OutputX(E1, E2) And Not E3 OrElse Not (E1 Or E2) And E3
    6. End Function
    7. Function OutputX(E1 As Boolean, E2 As Boolean, E3 As Boolean, E4 As Boolean) As Boolean
    8. Return OutputX(E1, E2, E3) And Not E4 OrElse Not (E1 Or E2 Or E3) And E4
    9. End Function
    10. Function OutputX(E1 As Boolean, E2 As Boolean, E3 As Boolean, E4 As Boolean, E5 As Boolean) As Boolean
    11. Return OutputX(E1, E2, E3, E4) And Not E5 OrElse Not (E1 Or E2 Or E3 Or E4) And E5
    12. End Function
    13. '...kann man beliegig erweitern
    @VB1963 Für eine Erweiterung mit noch mehr Parametern würde ich allerdings wieder die For Each-Variante präferieren, die ist auch in einem halben Jahr noch lesbar und verständlich.
    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!
    Ich würde auch jetzt schon die Schleife präferieren. Da es dir ja, wie du selbst sagst, nicht auf die Geschwindigkeit ankommt (wobei auch die Schleife immer noch schnell genug wäre), ist lesbarer Code immer vorzuziehen, und ich zumindest müsste schon bei der Variante mit 3 Parametern erstmal rumrätseln, was da überhaupt passiert.
    Ich weiß ja das gehört nicht zum eigentlichen Thema aber ich würde gerne mal wissen was überhaupt ein XOR ist. Erlerne gerade noch durch die Hilfe von SpaceyX VB.NET komplett, allerdings würde ich um den Kontext hier zu verstehen gerne mal grundlegend wissen was das ist. Vielleicht kann mir das Jemand kurz erklären... :)
    Es existiert ein Interesse an der generellen Rezession der Applikation relativ primitiver Methoden komplimentär zur Favorisierung adäquater komplexer Algorithmen.
    ------------------------------------------------------------------------------------
    Rising Existence - das GTA V-MP Projekt mit Zukunft und Innuvation
    XOR ist eine logische Verknüpfung mit dieser Wahrheitstabelle:
    Input AInput BOutput
    FalseFalseFalse
    TrueFalseTrue
    FalseTrueTrue
    TrueTrueFalse

    Für zwei EIngänge. Für mehr gibts zwei Definitionen, einmal so wie hier gefordert True wenn ein Eingang True, oder True wenn eine ungerade Anzahl Eingänge True.
    Vielen Dank. Jetzt verstehe ich auch wo hier das Problem ist.
    Wenn ich das richtig verstanden habe ist ein XOR mit 3 Inputs ziemlich schwer? :D
    Es existiert ein Interesse an der generellen Rezession der Applikation relativ primitiver Methoden komplimentär zur Favorisierung adäquater komplexer Algorithmen.
    ------------------------------------------------------------------------------------
    Rising Existence - das GTA V-MP Projekt mit Zukunft und Innuvation

    Maik H. schrieb:

    XOR mit 3 Inputs
    musst Du einfach Klammern setzen.
    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!

    jvbsl schrieb:

    Der TE wollte aber gar kein XOR haben...

    Aber der Titel heißt doch "XOR mit 3 Eingängen". Liege ich jetzt voll daneben und das ist wieder etwas anderes? ^^
    Es existiert ein Interesse an der generellen Rezession der Applikation relativ primitiver Methoden komplimentär zur Favorisierung adäquater komplexer Algorithmen.
    ------------------------------------------------------------------------------------
    Rising Existence - das GTA V-MP Projekt mit Zukunft und Innuvation

    Wikipedia schrieb:

    It is most common to regard subsequent inputs as being applied through a cascade of binary exclusive-or operations

    So wie man es bei Or/And/usw. macht, warum sollte man es hier dann auch anders machen?
    Es steht noch dabei, dass es manchmal als one-hot detector implementiert wird, aber eher nicht gängig ist...Vorallem, da mehrfach XOR häufiger benötigt wird als nen One-Hot-Detector..
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Gonger96 schrieb:

    Für mich ists nur ein XOr, wenn es 2 Inputs hat.
    Jou. Deswegen

    RodFromGermany schrieb:

    musst Du einfach Klammern setzen.
    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!