!(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.
-
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
-
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 (Konjunktion), (Disjunktion) und (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)