4 boolsche werte auswerten



  • hallo,

    ich habe 4 boolsche variablen und ich möchte wissen ob alle 4 gesetzt sind oder ob alle 4 nicht gesetzt sind.
    klang erstmal nach xor, aber gab dann probleme beim auswerten. offensichtlich kann man xor ausdrücke nicht ohne weiteres verketten.
    eine weitere, unschöne möglichkeit wäre wohl true = 1 und false = 0 anzunehmen (casten) und einfach zu addieren um dann zu schauen ob 0 oder 4.

    gibt es dafür eine cleverere lösung, möglicherweise als boolscher ausdruck?



  • XOR ist wohl das falsche für deine Zwecke - du brauchst UND bzw. ODER:

    alle gesetzt:         b1 && b2 && b3 && b4
    alle nicht gesetzt: !(b1 || b2 || b3 || b4)
    


  • Oder

    alle nicht gesetzt:   !b1 && !b2 && !b3 && !b4
    


  • danke für deine antwort cstoll

    am ende kommt dann aber ein so ähnlicher ausdruck raus - aus deinen beiden zusammengesetzt - wie:
    (b1 && b2 && b3 && b4) && (!(b1 || b2 || b3 || b4))

    das ist sehr unschön. und wäre interessant zu wissen ob es noch eine cleverere variante gibt.



  • igr schrieb:

    (b1 && b2 && b3 && b4) && (!(b1 || b2 || b3 || b4))

    Achsooo! Dachte, das seien zwei AUfgaben gewesen.
    Noch ein Vorschlag:
    (b1 == b2 && b1 == b3 && b1==b4)



  • igr schrieb:

    danke für deine antwort cstoll

    am ende kommt dann aber ein so ähnlicher ausdruck raus - aus deinen beiden zusammengesetzt - wie:
    (b1 && b2 && b3 && b4) && (!(b1 || b2 || b3 || b4))

    Vermutlich mit einem ODER dazwischen, aber ansonsten ja. Du kannst ja mal versuchen, den ganzen Ausdruck zu minimieren, aber ich hab' den Verdacht, daß dort nicht viel mehr herauszuholen ist. Eine Möglichkeit wäre es noch, anhand des ersten bools zu entscheiden, welche der beiden Möglichkeiten überhaupt in Frage können könnte:
    [cpp]return b1 ? (b2&&b3&&b4) : !(b2||b3||b4);[/cpp9



  • hallo volkard,

    wow die variante ist echt gut. macht sinn.

    s = b1+b2+b3+b4
    (s == 0 || s == 4)
    wäre sonst meine variante (wenn auch nicht mehr rein bool) gewesen, aber deine ist da eleganter.

    danke dir 🙂



  • Nee wiso, Du willst doch nur Wissen ob alle 4 gesetzt oder eben nicht gesetzt sind. Also reicht die Abfrage auf einen Zustand:

    if(b1 && b2 && b3 && b4)
    {
       // alle sind true, mach was ...
    }
    else
    {
       // alle sind false, mach was anderes
    }
    

    Auf "TRUE" UND "FALSE" kannste nicht Prüfen macht ja keinnen sinn !!
    Kann ja nur 1 oder 0 sein 😃



  • c#´ler schrieb:

    Nee wiso, Du willst doch nur Wissen ob alle 4 gesetzt oder eben nicht gesetzt sind. Also reicht die Abfrage auf einen Zustand:

    Ich glaube, du hast die Frage nicht richtig verstanden 😉



  • Ja sorry, glaub ich auch 🙂



  • igr schrieb:

    danke für deine antwort cstoll

    am ende kommt dann aber ein so ähnlicher ausdruck raus - aus deinen beiden zusammengesetzt - wie:
    (b1 && b2 && b3 && b4) && (!(b1 || b2 || b3 || b4))

    das ist sehr unschön. und wäre interessant zu wissen ob es noch eine cleverere variante gibt.

    Aber ja, "alle gesetzt" und "alle nicht gesetzt" zugleich, ist unmöglich. Daher ist kannst du den Ausdruck durch "false" ersetzen. 🙂



  • cstoll: ja das sollte natürlich ein ODER sein, sry, mein fehler.
    deine variante ist nicht mehr sehr lesbar aber wohl clever wie gefragt ^^ und vermutlich sogar die performanteste
    werd wohl volkards verwenden, lesbar, logisch, kurz.
    danke für die sehr schnellen antworten 🙂



  • 3&~(b1+b2+b3+b4)
    


  • igr schrieb:

    cstoll: ja das sollte natürlich ein ODER sein, sry, mein fehler.
    deine variante ist nicht mehr sehr lesbar aber wohl clever wie gefragt ^^ und vermutlich sogar die performanteste

    Und du hast natürlich gemessen, dass (b1 && b2 && b3 && b4) || (!(b1 || b2 || b3 || b4)) dein bottle neck ist. 🙄
    http://en.wikipedia.org/wiki/Program_optimization

    Optimization can reduce readability and add code that is used only to improve the performance. This may complicate programs or systems, making them harder to maintain and debug. As a result, optimization or performance tuning is often performed at the end of the development stage.

    Donald Knuth made the following two statements on optimization:

    "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil"[2]

    (He also attributed the quote to Tony Hoare several years later,[3] although this might have been an error as Hoare disclaims having coined the phrase.[4])

    "In established engineering disciplines a 12 % improvement, easily obtained, is never considered marginal and I believe the same viewpoint should prevail in software engineering"[2]

    "Premature optimization" is a phrase used to describe a situation where a programmer lets performance considerations affect the design of a piece of code. This can result in a design that is not as clean as it could have been or code that is incorrect, because the code is complicated by the optimization and the programmer is distracted by optimizing.

    An alternative approach is to design first, code from the design and then profile/benchmark the resulting code to see which parts should be optimized. A simple and elegant design is often easier to optimize at this stage, and profiling may reveal unexpected performance problems that would not have been addressed by premature optimization.



  • da wollte wohl jemand unbedingt seine link- und quoteliste loswerden anstatt eine zeile weiter zu lesen:

    igr schrieb:

    cstoll: ja das sollte natürlich ein ODER sein, sry, mein fehler.
    deine variante ist nicht mehr sehr lesbar aber wohl clever wie gefragt ^^ und vermutlich sogar die performanteste
    werd wohl volkards verwenden, lesbar, logisch, kurz.
    danke für die sehr schnellen antworten 🙂

    nochmal zur erinnerung:

    volkard schrieb:

    igr schrieb:

    (b1 && b2 && b3 && b4) && (!(b1 || b2 || b3 || b4))

    Achsooo! Dachte, das seien zwei AUfgaben gewesen.
    Noch ein Vorschlag:
    (b1 == b2 && b1 == b3 && b1==b4)



  • hansmeierzwergenklopfer schrieb:

    3&~(b1+b2+b3+b4)
    
    3&~(b1+b2+b3+b4) == 3
    

    Aber dann kann man auch gleich

    !((b1+b2+b3+b4)%4)
    

    schreiben.



  • Michael E. schrieb:

    hansmeierzwergenklopfer schrieb:

    3&~(b1+b2+b3+b4)
    
    3&~(b1+b2+b3+b4) == 3
    

    Aber dann kann man auch gleich

    !((b1+b2+b3+b4)%4)
    

    schreiben.

    emm, was sollte das fuer einen vorteil haben gegenueber dem code von hans, %4 wird der compiler zu &3 wandeln?
    (wobei ich glaube dass hans hier nen bug hat, sollte doch eher !(3&(b1+b2+b3+b4)) sein? )



  • rapso schrieb:

    Michael E. schrieb:

    hansmeierzwergenklopfer schrieb:

    3&~(b1+b2+b3+b4)
    
    3&~(b1+b2+b3+b4) == 3
    

    Aber dann kann man auch gleich

    !((b1+b2+b3+b4)%4)
    

    schreiben.

    emm, was sollte das fuer einen vorteil haben gegenueber dem code von hans, %4 wird der compiler zu &3 wandeln?
    (wobei ich glaube dass hans hier nen bug hat, sollte doch eher !(3&(b1+b2+b3+b4)) sein? )

    Eben, bei ihm muss man auf Gleichheit mit 3 prüfen. Dann hab zusätzlich noch aus "3&" ein "%4" gemacht, weil ich das besser parsen kann und es auch noch bei anderen Zahlen funktioniert.



  • naklar schrieb:

    da wollte wohl jemand unbedingt seine link- und quoteliste loswerden anstatt eine zeile weiter zu lesen:

    igr schrieb:

    cstoll: ja das sollte natürlich ein ODER sein, sry, mein fehler.
    deine variante ist nicht mehr sehr lesbar aber wohl clever wie gefragt ^^ und vermutlich sogar die performanteste
    werd wohl volkards verwenden, lesbar, logisch, kurz.
    danke für die sehr schnellen antworten 🙂

    nochmal zur erinnerung:

    volkard schrieb:

    igr schrieb:

    (b1 && b2 && b3 && b4) && (!(b1 || b2 || b3 || b4))

    Achsooo! Dachte, das seien zwei AUfgaben gewesen.
    Noch ein Vorschlag:
    (b1 == b2 && b1 == b3 && b1==b4)

    Das ist auch nicht lesbarer.


Log in to reply