HACKING 120% {Hacking, programmazione, computer & molto altro}

Aiuto Java

« Older   Newer »
  Share  
RootkitNeo
view post Posted on 16/11/2013, 00:36     +1   -1




@Shivaz (o altri): mi aspettavo domande su questa parte ((p & 0x80000000) >> 31 == -1) ? (~p+1) : p;. E' stata compresa subito?
 
Top
view post Posted on 16/11/2013, 11:57     +1   -1

Image and video hosting by TinyPic

Group:
Staffer onorari
Posts:
6,776
Reputation:
+5
Location:
Vicenza

Status:


No sinceramente non ho proprio capito nulla di quella parte ... credo di non avere ancora le conoscenze sufficienti :)
 
Top
RootkitNeo
view post Posted on 16/11/2013, 14:57     +1   -1




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:
CODICE
((p & 0x80000000)


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.

CODICE
(~p+1) : p


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.
 
Top
view post Posted on 17/11/2013, 11:00     +1   -1

Image and video hosting by TinyPic

Group:
Staffer onorari
Posts:
6,776
Reputation:
+5
Location:
Vicenza

Status:


Root grazie ho capito qualcosina ma non proprio tutto :)
 
Top
RootkitNeo
view post Posted on 17/11/2013, 11:39     +1   -1




Bhe se vuoi chiexere, ti spiego. ;-)
 
Top
19 replies since 12/11/2013, 21:23   241 views
  Share