Können Sie arithmetische Operatoren verwenden, um zwischen 0 und 1 zu wechseln?

74

Gibt es eine Möglichkeit, ohne logische und bitweise Operatoren, nur arithmetische Operatoren, zwischen ganzen Zahlen mit dem Wert 0 und 1 zu wechseln?

dh. "Variable? = Variable" macht die Variable zu einer 1, wenn sie 0 ist, oder zu einer 0, wenn sie eine Eins ist

Daniel Sopel
quelle
Beachten Sie, dass in JavaScript viele der folgenden Antworten als Boolescher Wert und nicht als Zahl ausgewertet werden. Zum Beispiel: !x, (x <= 0), (x == 0)etc.
Bryan Downing

Antworten:

223
x = 1 - x

Schaltet zwischen 0 und 1 um.

Reverend Gonzo
quelle
2
Um dies breiter anzuwenden, können Sie, wenn xes sich in einem bestimmten Bereich positiver Zahlen befindet, dies auch verwenden, um seinen Wert umzukehren (dh 7-x= 0/7, 1/6, 2/5, 3/4).
Pluto
27

Bearbeiten: Ich habe die Frage falsch verstanden, dachte, das OP könnte anyOperator verwenden

Ein paar mehr ... (ignoriere diese)

x ^= 1       // bitwise operator
x = !x       // logical operator
x = (x <= 0) // kinda the same as x != 1

Ohne Operator?

int arr[] = {1,0}
x = arr[x]
st0le
quelle
^ ist ein bitweiser Operator und! ist ein logischer Operator.
MAK
Während Ihre zweite Idee funktioniert, ist x = 1 - x eine viel bessere Lösung. Ein Array zu haben ist übertrieben / verschwenderisch.
Khalos
x = !xist eine gute Lösung, da sie mit Werten umgeht, die nicht Null oder Eins sind.
Mark Ingram
19

Angenommen, es wird als 0 oder 1 initialisiert:

x = 1 - x
Hamish
quelle
17

Noch ein anderer Weg:

x = (x + 1) % 2
MAK
quelle
4
+1, da dies immer 0 oder 1 ergibt, auch wenn Sie versehentlich eine Ganzzahl außerhalb dieses Bereichs angeben.
Nick Forge
@NickForge Wenn Sie eine andere Eingabe als 1 oder 0 in Betracht ziehen, sind Sie sicher, dass es gut ist, dass es nicht dagegen protestiert?
Alex
1
@Alex ob das eine gute Sache ist oder nicht, hängt von der Sprache und den Erwartungen an "Defensivität" ab. In C werden Boolesche Werte beispielsweise als Ganzzahlen mit mehr als 1 Bit gespeichert, sodass das Konzept "illegal" etwas unscharf ist.
Nick Forge
1
Bingo! Ich wollte ein ganzzahliges "XOR" ausführen, und das macht genau das: x = (A + B) % 2Wenn A und B beide 0 oder 1 sind. Danke!
Noio
6

Comedy-Variation der zweiten Methode von st0le

x = "\1"[x]
Hochofen
quelle
heh, liebe die nicht offensichtlichen Lösungen.
Hamish
2
Und wenn Sie das mögen, werden Sie lieben x = x["\1"];(C und C ++).
Steve Jessop
5

Ein anderer Weg, um ein bisschen umzudrehen.

x = ABS(x - 1) // the absolute of (x - 1)
Stomie
quelle
4
int flip(int i){
    return 1 - i;
};
ruslik
quelle
4

Nur für ein bisschen Abwechslung:

x = 1 / (x + 1);

x = (x == 0);

x = (x != 1);

Nicht sicher, ob Sie arithmetische Operatoren betrachten ==und !=sein sollen. Wahrscheinlich nicht, und obwohl sie in C funktionieren, würden stärker typisierte Sprachen das Ergebnis nicht in eine Ganzzahl konvertieren.

Steve Jessop
quelle
4

Sie können dies einfach versuchen

+(!0) // output:1

+(!1) // output:0
VIJAY P.
quelle
Dies ist jedoch stark sprachabhängig.
L. Dai
0

Sie können einfach verwenden: abs(x-1) oder einfach: int(not x)

Богдан Снурницын
quelle