XOR-Verknüpfung der drei Werte
Was ist der einfachste Weg, um eine drei-Wege-exklusiv, ODER?
In anderen Worten, ich habe drei Werte, und ich will eine Erklärung, die zu true ausgewertet IFF nur eine der drei Werte true ist.
So weit, das ist, was ich mir ausgedacht habe:
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
Ist es etwas einfacher, das gleiche zu tun?
Hier ist der Beweis, dass die oben genannten führt die Aufgabe:
a = true; b = true; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = true; b = true; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = true; b = false; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = true; b = false; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true
a = false; b = true; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = false; b = true; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true
a = false; b = false; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> true
a = false; b = false; c = false
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
Du musst angemeldet sein, um einen Kommentar abzugeben.
Genau drei Begriffe, die Sie verwenden können, dieser Ausdruck:
Der erste Teil ist
true
iff eine oder drei der Begriffetrue
. Der zweite Teil des Ausdrucks stellt sicher, dass nicht alle dreitrue
.Beachten Sie, dass der obige Ausdruck nicht NICHT verallgemeinern, um mehrere Begriffe. Eine allgemeinere Lösung ist eigentlich zählen wie viele Begriffe sind
true
, so etwas wie dieses:a ? 1 : 0
kann vereinfacht werden zu!!a
!
Betreiber. Zum Beispiel, würde dies nicht funktionieren, in Java oder C#.a^b^c
ist nur 1, wenn eine ungerade Anzahl der Variablen ist 1 (zwei '1' würde sich gegenseitig aufheben). So brauchen Sie nur für den Fall "alle drei sind 1":Andere Möglichkeit:
die passiert werden 9 Zeichen kürzer als die akzeptierte Antwort 🙂
Könnte man auch versuchen (in C):
!!a + !!b + !!c == 1
+
, wenna
,b
, undc
sind schon boolean, Sie brauchen auch nicht die doppelte negation!!
: nura+b+c===1
entspricht.!!
garantieren eine C wahr ist1
ist eigentlich Recht ordentlich. Ein bisschen paranoid im Kontext eines boolean-Logik der obwohl Frage. Wenn der rest von deinem code gut geschrieben ista+b+c==1
sollte noch ausreichend seinHier ist eine Allgemeine Implementierung, schlägt schnell fehl, wenn mehr als ein
bool
gefundentrue
.Nutzung:
Code:
Weil ich es kann.
Besser noch auf Python:
Diese können auch verwendet werden, wenn Aussagen!
Es meinen Tag gerettet für CLI-sich gegenseitig ausschließende Argumente durch Klicken (jeder hasst klicken)