Dunque l'operatore
(condizione) ? blocco1 : blocco2 si chiama operatore ternario. Il funzionamento è molto semplice: viene valutato quello che c'è a sinistra di '?', quindi la condizione, e se è vera viene eseguito il blocco1, altrimenti il blocco2.
In pratica è un if/else pù bello da vedere.
Sappiamo poi che in Java i numeri sono tutti
con segno. Quindi (come vi dovrebbero aver spiegato in Sistemi, se fai un ITI Informatico) sai che il bit più a sinistra determina il segno del numero. Se il bit a sinistra vale 1, il numero è negativo se vale 0 è invece positivo.
Sai poi un altra cosa, che la tua variabile p è a 32bit, quindi 4byte. In binario quindi è rappresentato così:
CODICE
00000000'00000000'00000000'00000000
gli apostrofi sono solo per dividere se le sequenze di 8bit.
Supponiamo venga inserito il numero 10 (decimale), il binario è quindi rappresentato così:
CODICE
00000000'00000000'00000000'00001010
L'operatore & si chiama AND logico, ed è appunto un operatore logico. Applicato ai bit restituisce 1 dove entrambi i numeri sono 1 e 0 in tutti gli altri casi.
Analizzando una parte della condizione:
uso l'operatore & applicato ad un numero esadecimale, che in binario è:
CODICE
10000000'00000000'00000000'00000000
Quindi:
CODICE
10000000'00000000'00000000'00000000
&
00000000'00000000'00000000'00001010
----------------------------------------------
00000000'00000000'00000000'00000000
ottengo quindi tutti 0, ergo, il numero è positivo.
I numeri negativi vengono invece rappresentati facendo il complemento a due di un numero positivo (e viceversa ovviamente). Il complemento a due significa invertire tutti i bit di un numero ed aggiungere 1.
Nel caso del numero 10 quindi ottengo -10 invertendo tutti i bit e sommando 1:
CODICE
11111111'11111111'11111111'11110101
+
00000000'00000000'00000000'00000001
_________________________________
11111111'11111111'11111111'11110110
Ora guardando il bit più a sinistra, sappiamo che il numero è negativo.
Applicando ora la & con il numero precedente, otteniamo:
CODICE
11111111'11111111'11111111'11110110
&
10000000'00000000'00000000'00000000
-----------------------------------------------
10000000'00000000'00000000'00000000
ricorda appunto che & restituisce 1 solo se i bit sono entrambi 1.
Ora guardando il risultato deduciamo che il numero è negativo. Volendo avrei potuto fermarmi qui, ma visto che la numerazione binaria è posizionale (come la decimale) se io lascio quel bit 1 a sinistra e leggo il numero ottengo -2 miliardi e passa milioni.
Quindi sposto il bit 1 a destra di 31 posizioni:
CODICE
10000000'00000000'00000000'00000000
>>
31
-----------------------------------------------
00000000'00000000'00000000'00000001
ora posso verificare se il numero corrisponde a -1. Se corrisponde (è uguale) a -1, il numero è negativo quindi eseguo la parte dopo al punto interrogativo, altrimenti quella dopo ai due punti.
quella sorta di bisciolina, che si chiama tilde, è chiamata operatore NOT. Anche lui è uno di quelli a livello bit, ed effettua il complemento a uno di un numero. In pratica inverte tutti i bit del numero. Aggiungendo 1 ottengo il complemento a due.
Questo quindi che significa? Che dopo al controllo vedendo che il numero è negativo, faccio il complemento a due trasformandolo in positivo.
Se viene eseguita la parte dopo ai due punti so che il numero è positivo, quindi non lo tocco.