2016-04-19 17 views
5

Sono nuovo in scala e stavo cercando di accedere all'operatore scala non. Ho saputo che avrei potuto usare l'operatore '-' per un'operazione NOT logica. Ma a volte questo operatore mi dà una risposta negativa, come (-1)Perché usare l'operatore '~' in scala mi dà un valore negativo

Ad esempio:

val x = 1 
val y =(~x) 

Qui il valore y mi dà un -1 al posto di un 0. Ma ho bisogno la risposta nella forma di un 1 o di uno 0. Qualcuno può dirmi cosa mi manca qui? Grazie per il vostro aiuto in anticipo.

+5

Sono confuso: la tua domanda (titolo, testo) si riferisce all'operatore meno ('-') ma il tuo esempio di codice usa tilde (' ~ ') - che è? –

+0

@TzachZohar Scusa. Stavo parlando dell'operatore '~'. – Goldengirl

+0

Cosa ti fa pensare che 'Int.unary_ ~' esegua un'operazione logica NOT? La [documentazione] (http://scala-lang.org/api/current/index.html#[email protected]_~:Long) dice "Restituisce la ** negazione bit a bit ** di questo valore." [Entrambi] (http://stackoverflow.com/a/36693869/2988) [risposte] (http://stackoverflow.com/a/36694040/2988) alla tua [ultima domanda] (http://stackoverflow.com/q/36693811/2988) dire che è un operatore bit a bit. Entrambe le risposte si collegano alla documentazione dicendo che è un operatore bit a bit. –

risposta

9

A differenza di molte altre lingue, Scala non supporta utilizzando numeri o altri tipi di valori in contesti in cui è previsto un valore booleano. Ad esempio, nessuna delle seguenti linee di compilazione:

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

Alcune lingue hanno un idea di "truthiness" Sarebbe qui utilizzato per determinare se la condizione è, ma Scala Indifferente, se si vuole un valore booleano , è necessario utilizzare uno Boolean.

Ciò significa che la normale negazione logica non ha senso per i numeri e ~ è qualcosa di completamente diverso: ti dà la negazione bit per bit, che non è ciò che desideri. Invece sembra probabile che si desidera qualcosa di simile:

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

cioè di trasformare in modo esplicito il proprio numero in un valore booleano e poi lavorare con che l'utilizzo di negazione logica standard (!).

3

~ è la negazione bit a bit, ovvero prende ogni bit del numero specificato e lo nega, trasformando ogni 0 bit in 1 bit e 1 bit in 0 bit. Poiché il primo bit di un numero firmato indica il suo segno (0 per i numeri positivi, 1 per il negativo), ciò causa numeri positivi e zero per diventare negativi (e viceversa).

Se si desidera una semplice negazione logica, utilizzare solo Booleans e !.

PS: nota che nel codice che hai inserito, il valore di sarà -2, non -1 come hai scritto nel tuo post.

2

Se si desidera convertirlo da 0 a 1 o viceversa è possibile utilizzare l'operatore ^ (XOR).

val x = 1 
val y = 1^x 
Problemi correlati