!(A&&B) ohne den ! Operator



  • Hallo Leute,

    Kurze Frage:

    Wie kann ich folgenden Sachverhalt: !(a&&b) ohne den ! Operator formulieren?

    Also eine Umformung wäre: A/B || B/A
    aber ich glaube den Mathematischen Operator '/' bzw. 'Ohne' gibt es in C nicht.
    Fällt euch eine andere Umformungsmöglichkeit ein?

    Ich bin über jeden Tipp dankbar.

    LG



  • Gar nicht.



  • War heute eine Frage in der Vorlesung. Sollte also möglich sein.


  • Mod

    Was ist denn die Motivation dafür? Eine Hausaufgabe? Was ist die genaue Aufgabenstellung? Rein mit den logischen Operatoren (in C gibt es nur AND, OR und NOT) geht das nämlich nicht umzustellen, ohne ein NOT zu benutzen.

    Also eine Umformung wäre: A/B || B/A

    Das klingt falsch (und geschummelt, da es das NOT versteckt). Die Wahrheitstabelle davon ist doch

    0 1
    0 0 1
    1 1 0
    

    (also XOR), die Wahrheitstabelle von !(A&&B) ist jedoch

    0 1
    0 1 1
    1 1 0
    

    (also NAND)

    Man kann sicherlich irgendwas zurecht biegen, indem man anfängt, mit Wahrheitswerten zu rechnen, aber das ist dann keine Boolesche Algebra mehr, sondern nutzt spezielle "Features" der Sprache C aus (nämlich dass es keinen echten bool-Datentyp gibt).



  • Was nicht passt wird passend gemacht

    #include <stdio.h>
    #include <stdbool.h>
    
    bool NAND[2][2] = {{true, true}, {true, false}};
    
    int main (void) {
    	printf ("%d\n", NAND[true][true]);
    	return 0;
    }
    

    Kann man mit Makros sicher noch "schöner" machen :p


  • Mod

    Der echte Tim schrieb:

    Was nicht passt wird passend gemacht

    Das gefällt mir schon wesentlich besser. Mein Vorschlag wäre nämlich ein Monstrum in der Art von -(a&&a)*(b&&b)+1 gewesen (oder, falls a und b nur 0 und 1 sein können, vereinfachbar zu -a*b+1 ). Aber wie erwähnt, ist keine unserer Lösungen Aussagenlogik (um die es in der Vorlesung zu gehen scheint), sondern bloß Computerspielerei.



  • /close



  • Ein XOR true sollte funktionieren:

    ((a&&b)^true)
    


  • Kexplx schrieb:

    Hallo Leute,

    Kurze Frage:

    Wie kann ich folgenden Sachverhalt: !(a&&b) ohne den ! Operator formulieren?

    Mathematisch (bzw. logisch) gesehen, gar nicht, weil \wedge (Konjunktion), \vee (Disjunktion) und ¬\neg (Negation) die Basis Operatoren sind, auf die alle anderen basieren.

    Programmiertechnisch ist es dennoch möglich, weil in C (und viele C-basierten Sprachen) jeder Ausdruck, der zu 0 ausgewertet ist, auch als False ausgewertet ist, sonst True. Da kannst du die Negation durch diesen Trick machen:

    int neg(int expr)
    {
      expr = expr ? 1 : 0;
      return 1 - expr;
    }
    
    void foo()
    {
      int true_var = 7;
    
      if(true_var)
        printf("true_var als TRUE ausgewertet\n");
      else
        print("true_var als FALSE ausgewertet\n");
    
      int false_var = neg(true_var);
    
      if(false_var)
        printf("false_var als TRUE ausgewertet\n");
      else
        print("false_var als FALSE ausgewertet\n");
    }
    

    Ausgabe wird sein:

    true_var als TRUE ausgewertet
    false_var als FALSE ausgewertet
    

    d.h. !(a&&b) kannst du auch so umschreiben:

    (a&&b) ? 0 : 1
    // oder
    1 - ((a&&b) ? 1 : 0)
    

Log in to reply