Recentemente ho frequentato un corso di Java (corso intensivo della durata di 1 settimana) e abbiamo coperto alcuni aspetti matematici binari.Unario operatore "~" - Cosa sta succedendo esattamente qui?
Questo ~ operatore unario (tilde credo che si chiama?) È stato spiegato a noi così:
inverte lo schema di bit trasformando ogni "0" in un "1" ed ogni "1" in una " 0" . ad es. Ci sono 8 bit per un byte. Se si ha il seguente byte: 00000000 il valore invertito cambierebbe per diventare 11111111.
La spiegazione di cui sopra è chiara e concisa, e totalmente sensata per me. Finché, cioè, cerco di implementarlo.
Dato questo:
byte x = 3;
byte y = 5;
System.out.println(~x);
System.out.println(~y);
L'output è:
-4
-6
Sono molto confuso su come questo accade.
Se +3 in binario è 11, l'inversione di questo sarebbe 00, che chiaramente non è -3.
Ma come ci sono 8 bit in un byte, allora la rappresentazione binaria di +3 non dovrebbe essere scritta come 00000011?
Quale sarebbe invertito per diventare 11111100. Convertito di nuovo in valore decimale questo sarebbe 252. Se tuttavia si scrive il +3 come 011, quindi converte effettivamente in 100, che è +4, ma come si fa sai che è un numero negativo?
Che ne dici se provi 0011, che converte in 1100, che se usi il primo bit come segno, allora diventa effettivamente -4.
Ah, quindi a questo punto ho pensato di arrivare da qualche parte.
Ma poi sono arrivato al secondo valore di y = 5.
Come scriviamo questo? Usando la stessa logica, +5 converte in binario 0101, che inverte in 1010.
Ed è ora che sono orribilmente confuso. Questo sembra rappresentare un valore con segno di -2 o un valore senza segno di +10 decimale? Nessuno dei due è il -6 che sto stampando.
Ancora, se aumento la lunghezza fino alle 8 cifre di un byte, +5 è 00000101, che diventa invertito 11111010. E davvero non riesco a trovare un modo per trasformarlo in -6.
Qualcuno là fuori lo capisce, perché non ho idea di cosa stia succedendo qui e più numeri che stampo più divento confuso.
Google non sembra venire con qualsiasi cosa molto su questo - forse non gli piace guardare piccoli segni operatore .. :-(
Tutti i tipi numerici integrali in Java sono * firmati *. –
@MarkoTopolnik char è un tipo numerico e non è firmato. –
Dopo tutte le risposte molto utili per quanto riguarda il complemento a 2, ho trovato questo video che sembra spiegarlo abbastanza bene. Grazie a tutti coloro che hanno risposto. http://www.youtube.com/watch?v=Hof95YlLQk0&NR=1&feature=endscreen –