Boolescher Operationstrick

7

Ich habe das vorher im Code gesehen, aber es vergessen. Im Grunde schaltet es eine boolesche Variable um. Wenn es wahr ist, wird es auf falsch gesetzt und umgekehrt. Habe aber leider die Syntax vergessen.

Es ist im Grunde ein One Liner dafür:

%Vor%

Es ist ungefähr so, aber ich weiß nicht, wie es heißt oder wie es richtig heißt:

%Vor%     
dime 10.09.2010, 18:43
quelle

13 Antworten

70

Wie wäre es mit

? %Vor%

?

    
Alexander Rautenberg 10.09.2010, 18:44
quelle
27

myVar = myVar ? false : true; verwendet den bedingten Operator .

Sie können das aber einfach tun

%Vor%     
nos 10.09.2010 18:44
quelle
17

Eine andere Option ist XOR:

%Vor%

Es ist bemerkenswert, dass sich nur die LHS der Aufgabe ändert; Die rechte Seite ist konstant und schaltet jede boolesche Variable um. Negation ist jedoch mehr selbstdokumentierende IMO.

    
Mark Peters 10.09.2010 19:09
quelle
5

Was Sie denken, ist der bedingte Operator:

%Vor%

(Wie Sie sehen, nennen viele Leute dies den "ternären Operator", aber das bedeutet nur, dass es ein Operator mit drei Operanden ist. Es gibt nur einen Operator mit drei Operanden in dieser Sprache, aber es sagt noch nichts über das, was der Operator tut.)

Es ist natürlich einfacher, den Negationsoperator zu verwenden:

%Vor%     
Guffa 10.09.2010 18:47
quelle
4

Der kleinste Code, den ich mir momentan vorstellen kann. Ich weiß nicht, wie es heißt (wenn es einen Namen hat, wie Sie scheinen)

%Vor%     
Goutham 10.09.2010 18:46
quelle
4

Worüber Sie sprechen, ist der "ternäre" oder "bedingte" Operator, der eine Inline-Substitution gemäß einer Bedingung ausführt.

Die Syntax lautet:

%Vor%

Normalerweise gebe ich Klammern um meinen Zustand herum, manchmal um den ganzen Bedingungsoperator herum. Hängt davon ab, wie viel ich versuche, es von allem anderen abzugrenzen.

Nehmen Sie zum Beispiel an, dass Sie die größere von zwei Zahlen zurückgeben möchten:

%Vor%

Beachten Sie, dass es in die Mitte von etwas anderem eingefügt werden kann.

Okay, lassen Sie uns jetzt Ihre eigentliche Frage zum Umschalten eines booleschen Typs angehen.

%Vor%

ist, wie Sie es mit dem bedingten Operator tun würden. (Wiederum sind Klammern nicht erforderlich, ich bevorzuge sie einfach.)

Aber es gibt einen einfacheren Weg, um den booleschen ... mit dem logischen Operator NOT ("!") umzuschalten:

%Vor%

Halte es einfach. : -)

    
Platinum Azure 10.09.2010 18:48
quelle
3
%Vor%     
PaulJWilliams 10.09.2010 18:49
quelle
2

Das funktioniert auch: P

%Vor%     
OscarRyz 10.09.2010 19:26
quelle
0

Es gibt einen ternären Operator ( wikipedia ). Damit können Sie wie im zweiten Beispiel eine verdichtete if-else-Anweisung schreiben.

In Java:

%Vor%

Es gibt auch den Operator NOT, der eine boolesche Variable umschaltet. In Java ist das! Ich glaube, das ist was du willst.

%Vor%     
dnephin 10.09.2010 18:48
quelle
0
%Vor%     
baklap 10.09.2010 18:53
quelle
0

Ich habe kürzlich (auf eigene Faust) eine ähnliche Antwort auf eine bereits hier angegebene gefunden. Die einfachste und kürzeste Antwort lautet jedoch:

%Vor%

Dies funktioniert am besten in JavaScript, wenn Sie boolesche, DOM-basierte Attribute umschalten möchten (z. B. die deaktivierte Eigenschaft einer Formularsteuerung / -eingabe - von einem nicht bearbeitbaren in einen Bearbeitungszustand wechseln). Nach vielem Suchen (ohne Ergebnis, das mir gefiel) und etwas Versuch und Irrtum, fand ich meine Lösung am einfachsten (aber wahr statt 1 wäre klarer - wie es vorher gepostet wurde).

Da diese Syntax nicht sehr klar ist, würde ich sie nicht sehr oft empfehlen (ich glaube, es ist angemessen, wenn die Variable oder Eigenschaft den Kontext offensichtlich macht). Ich habe diese Antwort gepostet (anstatt sie zu kommentieren), weil der Kontext, in dem die XOR bitweise Selbstzuweisung verwendet werden sollte, sehr wichtig ist. Dieser "Trick" sollte meistens vermieden werden, wenn Best Practices berücksichtigt werden.

    
Joe Johnson 26.07.2012 21:47
quelle
-1

Wie andere bemerkt haben, gibt es zwei Möglichkeiten, etwas zu negieren: "lvalue =! lvalue;" und "lvalue ^ = 1;". Es ist wichtig, die Unterschiede zu erkennen.

Wenn "lvalue =! lvalue" angegeben wird, wird lvalue auf 1 gesetzt, wenn es Null war, und 0, wenn es auf anderes gesetzt war . Der Lvalue wird zweimal ausgewertet; Dies ist kein Faktor für einfache Variablen, aber "someArray [index1] [index2] [index3] [index4] =! someArray [index1] [index2] [index3] [index4]" könnte die Dinge verlangsamen.

Sagen "Lvalue ^ = 1;" Lvalue wird auf 1 gesetzt, wenn es 0 war, 0, wenn es 1 war, und etwas anderes, wenn es weder Null noch 1 war. Der Lvalue muss nur einmal spezifiziert oder ausgewertet werden, und wenn der Wert als Null bekannt ist oder 1, diese Form ist wahrscheinlich schneller.

Schade, dass es keinen auto-negate-Operator gibt; Es gibt Zeiten, in denen so etwas praktisch wäre.

    
supercat 10.09.2010 20:52
quelle
-2

Sie können auch die binäre Form der Negation wie hier gezeigt verwenden.

%Vor%     
kbob 10.09.2010 21:46
quelle

Tags und Links