2016-04-19 13 views
5

Ich bin neu bei scala und habe versucht auf den scala nicht Operator zuzugreifen. Ich habe erfahren, dass ich den Operator '-' für die logische NOT-Operation verwenden kann. Aber manchmal dieser Operator gibt mir eine negative Antwort wie (-1)Warum gibt mir der '~' Operator in scala einen negativen Wert

Zum Beispiel:

val x = 1 
val y =(~x) 

Hier ist der Wert y gibt mir eine -1 anstelle eines 0. Aber ich brauche die Antwort in der Form einer 1 oder einer 0. Kann mir jemand sagen, was fehlt mir hier? Vielen Dank für Ihre Hilfe im Voraus.

+5

Ich bin verwirrt: Ihre Frage (Titel, Text) bezieht sich auf Minus-Operator ('-'), aber Ihr Code-Beispiel verwendet Tilde (' ~ ') - was ist das? –

+0

@TzachZohar Entschuldigung. Ich sprach über den '~' Operator. – Goldengirl

+0

Was lässt Sie denken, dass 'Int.unary_ ~' eine logische NOT-Operation ausführt? Die [Dokumentation] (http://scala-lang.org/api/current/index.html#[email protected]_~:Long) sagt "Gibt die ** bitweise Negation ** dieses Wertes zurück." [Both] (http://stackoverflow.com/a/36693869/2988) [Antworten] (http://stackoverflow.com/a/36694040/2988) auf Ihre [letzte Frage] (http://stackoverflow.com)/q/36693811/2988) sagen, es ist ein bitweiser Operator. Beide Antworten verweisen auf die Dokumentation, die besagt, dass es sich um einen bitweisen Operator handelt. –

Antwort

9

Im Gegensatz zu vielen anderen Sprachen unterstützt Scala nicht die Verwendung von Zahlen oder anderen Arten von Werten in Kontexten, in denen ein boolescher Wert erwartet wird. Zum Beispiel keines der folgenden Zeilen zusammenstellen:

if (1) "foo" else "bar" 
if ("1") "foo" else "bar" 
if (List(1)) "foo" else "bar" 

Einige Sprachen haben eine Vorstellung von „Truthiness“, das hier verwendet werden würde, um zu bestimmen, ob die Bedingung erfüllt ist, aber Scala Passt nicht-wenn Sie einen boolean wollen , müssen Sie eine verwenden.

Das bedeutet, dass gewöhnliche logische Negation für Zahlen keinen Sinn ergibt, und ~ ist etwas völlig anderes - es gibt Ihnen eine bitweise Negation, die nicht das ist, was Sie wollen. Stattdessen scheint es wahrscheinlich, dass Sie so etwas wie dies wollen:

val x = 1 
val nonzeroX = x != 0 
val y = !nonzeroX 

D.h. Sie ausdrücklich Ihre Zahl in einen Booleschen Wert umwandeln und dann mit, dass unter Verwendung von Standard logischer Negation arbeiten (!).

3

ist bitweises Negieren, dh es nimmt jedes Bit der gegebenen Zahl und negiert es, indem es jedes 0-Bit in ein 1-Bit und jedes 1-Bit in ein 0-Bit umwandelt. Da das erste Bit einer vorzeichenbehafteten Zahl sein Vorzeichen angibt (0 für positive Zahlen, 1 für negativ), verursacht dies positive Zahlen und Null wird negativ (und umgekehrt).

Wenn Sie einfache logische Negation wollen, verwenden Sie einfach boolesche Werte und !.

PS: Beachten Sie, dass in dem von Ihnen geposteten Code der Wert y-2 ist, nicht -1, wie Sie in Ihrem Beitrag geschrieben haben.

2

Wenn Sie nur von 0 zu 1 oder umgekehrt konvertieren möchten, können Sie ^ (XOR) -Operator verwenden.

Verwandte Themen