JavaRush /Java Blog /Random-IT /Negazione bit a bit: perché è così?
Alex Bolgov
Livello 37
Ташкент

Negazione bit a bit: perché è così?

Pubblicato nel gruppo Random-IT
Ciao a tutti :) Leggendo l'articolo Operazioni bit a bit, anch'io, come altri, avevo una domanda: perché, quando invertiamo il numero 342, otteniamo -343. Ecco come appare nell'articolo: Negazione bit a bit - perché così - 1Chi è particolarmente curioso (come me) ha una domanda: "ehi, ma 010101001 è inferiore a 101010110, è logico che sia inferiore a 342 e positivo". Digitandolo in qualsiasi convertitore di numeri online o controllandolo utilizzando il codice:
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
inaspettatamente otteniamo qualcosa di diverso da -343...
169
Oh, quanto è bello che una volta, in una lezione sulla programmazione in C, in qualche modo ho sentito brevemente qualcosa sulla cifra del segno negli interi. Dopo aver cercato su Google per un po', ora posso spiegare che tipo di animale è questo. Negazione bit a bit - perché così - 2In effetti nell’articolo c’è un’inesattezza che crea confusione. Se controlliamo con il codice qual è realmente il risultato dell'inversione del numero 342:
int a = 342;
System.out.println(Integer.toBinaryString(~a));
quindi vedremo un risultato leggermente diverso
11111111111111111111111010101001
Perché è così? Il fatto è che una variabile non può contenere semplicemente 101010110; infatti, viene memorizzata come
000000000000000000000000101010110
Dopotutto, una variabile int occupa 4 byte, cioè 32 bit - 32 celle di memoria. Dopo l'inversione, assolutamente tutti i numeri cambiano, ad es. e zeri iniziali "tagliati". Ora arriva la parte divertente. Poiché nella rappresentazione binaria non è possibile memorizzare il segno + o - davanti a un numero, c'è un trucco: il primo bit è effettivamente responsabile del segno ed è proprio il bit del segno . E tutti i numeri vengono memorizzati secondo questa logica: i numeri da 00...000 a 01...111 sono positivi, a partire da 0 (cioè da 0 a 2147483647) e a partire da 10...000 a 11...111 sono negativi, a partire dal più piccolo e terminano con -1 (ovvero da -2147483648 a -1).
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
E poi chiedi: "Va bene, Navalny, ti crederemo, ma perché hai deciso che questo è il suo palazzo", ma come risulta essere -343 con tutto questo? È davvero semplice. Possiamo semplicemente calcolarlo manualmente. Se "tagliamo" (o sostituiamo con 0) il primo bit dalla versione binaria del numero risultante 342 ( 111111111111111111111111111111111111111010101001 ) e lo riportiamo in forma decimale.
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
allora lo capiamo
011111111111111111111111010101001 = 2147483305
In effetti qui non abbiamo semplicemente “tagliato” 1 all’inizio, ma abbiamo sottratto 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, ora aggiungiamolo nuovamente, ma in forma decimale. Cosa vedremo:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
Ecco il numero richiesto -343 :) Ragazzi, questo è il mio primo post qui, mettete mi piace se vi è piaciuto ed è stato informativo (voglio davvero raccogliere tutti i risultati 😄) Potete leggere di più su questo argomento qui: Buona fortuna a tutti e grazie per l'attenzione)
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION