JavaRush /Java Blog /Random-IT /Java: bit e byte
Viacheslav
Livello 3

Java: bit e byte

Pubblicato nel gruppo Random-IT
Java: bit e byte - 1

introduzione

Se le persone contano nel sistema decimale, i computer contano nel sistema binario. E un programmatore deve capire come parlare sia alle persone che ai computer. Questa recensione dovrebbe aiutare in questa materia. A volte dietro l'ovvio si nasconde un mondo intero. Propongo di parlare di questo mondo. Ad esempio, ci sono 7 giorni in una settimana. Ora rispondiamo alla domanda: qual è il numero “7”? ) Innanzitutto, è un numero naturale intero (positivo). È anche un numero decimale. Un numero decimale è un numero nel sistema decimale. Quando diciamo "sistema numerico decimale", significa che il sistema numerico ha una base di 10 . La radice mostra quante cifre possono essere utilizzate in un dato sistema numerico per rappresentare un numero. Il conto alla rovescia parte da zero. Di conseguenza, per rappresentare i numeri nel sistema decimale, utilizziamo i numeri da 0 a 9. Questo va bene, ma dobbiamo contare non solo fino a 9, ma anche oltre. Come essere? Ad esempio, il numero 10. Per scrivere questo numero, utilizziamo fino a 2 cifre. La posizione di ciascuna cifra nel sistema decimale è chiamata cifra decimale. Le cifre si contano da destra a sinistra:
Java: bit e byte - 2
Inoltre il numero decimale può essere espanso come segue: 103 = 1*10^2 + 0*10^1 + 3*10^0
Java: bit e byte - 3
Il numero cresce essenzialmente da destra a sinistra. Cioè, all'inizio era 7, poi è diventato 10. Pertanto, le cifre vengono contate da destra, partendo da zero. A cosa serve tutto questo? Questo perché non siamo computer. E mentre noi contiamo in formato decimale (ovvero in base 10), i computer contano in binario (ovvero in base 2). Ma le regole che si applicano a questi sistemi numerici sono le stesse.
Java: bit e byte - 4

Sistema binario

Il sistema binario è molto simile al sistema decimale, con l'unica differenza che il limite qui non è 10, ma 2. Confrontiamo con un esempio. Come rappresentiamo 11 in binario? È molto semplice: devi solo dividere il numero decimale per base 2, cioè contare 11/2 in una colonna. Esempio:
Java: bit e byte - 5
Oppure ecco un esempio da WikiHow:
Java: bit e byte - 6
È interessante notare che possiamo rappresentare un numero in binario allo stesso modo che in decimale: 111 in binario = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java: bit e byte - 7
Un esempio di conversione da binario a decimale può essere visto nel calcolatore online . Parlando del fatto che le regole di funzionamento nei sistemi numerici sono le stesse, diamo un'occhiata all'addizione nel sistema binario:
Java: bit e byte - 8
Come puoi vedere, trasferiamo le cifre durante l'addizione allo stesso modo del sistema decimale. L'analisi dell'addizione può essere vista, ad esempio, qui: A proposito, periodicamente viene menzionata la parola "scarico". E che cos'è? Il luogo è solo un “elemento strutturale” per rappresentare un numero. Cioè, il numero 10 è composto da due cifre: per scrivere questo numero abbiamo bisogno di 2 cifre, 2 cifre, 2 elementi. È importante capirlo perché nel sistema numerico binario una cifra è un bit . La parola Bit deriva dall'inglese "binary digit" , cioè un numero binario. Può essere 0 o 1. Ma proprio come leggiamo i numeri e le parole nel loro insieme, e non lettera per lettera, i computer non leggono un bit alla volta. Per il “pezzo” minimo di informazione elaborata nella RAM (la cosiddetta più piccola unità di informazione indirizzabile), viene letta una sequenza di 8 bit . Poiché ce ne sono 8, questo è chiamato "ottetto". E anche la parola più nota Byte . Per ricordare l'ottetto, ricordiamo che la parola polpo (otto zampe) è tradotta in inglese come polpo. Cioè, ecco esattamente lo stesso "octo" nel titolo:
Java: bit e byte - 9
Pensiamo a qual è il numero massimo che possiamo rappresentare come 8 bit?
Java: bit e byte - 10
E qui sorge la domanda: che dire dei numeri negativi? Per capirlo, parliamo di come sono rappresentati i byte in Java
Java: bit e byte - 11

Java e Byte

Com'è possibile utilizzare i numeri negativi in ​​Java? È fatto semplicemente. In Java, i byte sono firmati. La cifra/bit più a sinistra (chiamata anche “bit più significativo”) viene trasformata in una sorta di “marcatore” che risponde alla domanda: “Questo numero è negativo?” Se la risposta è sì, il marcatore ha il valore 1. Altrimenti è 0. Vediamo un esempio di come trasformare il numero 5 in un numero negativo 5:
Java: bit e byte - 12
Sulla base di questa immagine è possibile comprendere i limiti entro i quali si trova un valore Byte:
Java: bit e byte - 13
È inoltre chiaro che:
  • se aggiungiamo uno a 127, otteniamo -128.
  • se sottraiamo uno da -128, otteniamo 127.
Pertanto, Byte in Java può assumere un valore compreso tra -128 e 127. Come ricordiamo, un byte è un ottetto. E la cifra massima/bit più significativo ha un numero seriale pari a 7, poiché contiamo da zero. In questo caso è facile ricordare che un byte è uguale a -2 elevato alla potenza di 7 (limite inferiore) a 2 elevato alla potenza di 7 meno 1 (limite superiore). Lavorare con il tipo di dati stesso è semplice. Utilizziamo il compilatore Java online “repl.it” come “sandbox” per questo articolo. https://repl.it/linguals/java. Ad esempio, eseguiamo il codice che rappresenterà una variabile byte in formato binario come una stringa:
class Main {
  public static void main(String[] args) {
    byte octet = 5;
    String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
    System.out.println(bin);
  }
}
L'utilizzo dei byte viene utilizzato attivamente quando si lavora con i flussi I/O. Puoi leggere di più nel tutorial di Oracle: " I/O Streams ". Inoltre, in Java puoi utilizzare un letterale speciale per specificare il valore in bit:
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java: bit e byte - 14

Manipolazione dei bit

Toccando byte e bit, non si può non menzionare le varie manipolazioni dei bit. Probabilmente l'operazione più comune è lo spostamento (spostamento bit a bit o spostamento bit). E tutto perché il loro risultato presenta chiari vantaggi pratici. Come si usa? Lo spostamento a sinistra di N posizioni equivale a moltiplicare il numero per 2N. E uno spostamento a destra è simile alla stessa divisione, quindi 5<<2 == 5*Math.pow(2,2) E per capire perché è così, diamo un'occhiata a questo esempio in modo più dettagliato:
Java: bit e byte - 15
La negazione bit per bit NOT (unario bit per bit), rappresentata da una tilde, inverte i bit. È scritto come una tilde, ad esempio ~5.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
Ciò dimostra ancora una volta che quando Java cambia il segno di un numero, oltre a invertire i valori dei bit alla fine, eseguiamo +1. E senza questo, come vediamo, il nostro numero 5 cambia. E affinché rimanga lo stesso numero di prima di cambiare segno, devi fare +1. L'AND bit a bit consente di lasciare due numeri diversi con il valore 1 per un bit solo se tutti i bit hanno valore uno. La cosa interessante di questo potrebbe essere che presenta alcuni vantaggi applicativi:
int x=4;
System.out.println((x&1) != 1);
Questo codice controlla la parità del numero x. Diamo un'occhiata ad un esempio:
Java: bit e byte - 16
Utilizzando Bitwise AND e Bitwise OR insieme, puoi utilizzare le maschere:
public static void main(String[] args) {
    byte optionA=0b0100;
    byte optionB=0b0010;
    byte optionC=0b0001;
    byte value = (byte)(optionB | optionC);
    // Check for optionB
    if ((optionC & value) != 0b0000) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
Vedere " Opzioni di mascheramento con operatori bit a bit in Java " per maggiori dettagli . La manipolazione dei bit è un argomento interessante su cui sono state scritte recensioni, articoli e libri separati. E da qui inizia il lungo cammino verso la crittografia. Nell’ambito di questa recensione, vale la pena capire perché funziona e come. Per ulteriori informazioni sulle operazioni bit, consiglio di leggere la recensione di tproger: " Informazioni sulle operazioni bit ".

Tipi primitivi

Quindi un byte è un ottetto, cioè 8 bit. È facile ricordare che in Java esistono anche 8 tipi primitivi, guarda caso. Un tipo primitivo è un tipo di dati incorporato in un linguaggio di programmazione, ovvero disponibile per impostazione predefinita. byte è il tipo di dati primitivo più piccolo in termini di spazio di memoria con cui Java può funzionare. Come abbiamo detto prima, un byte occupa 8 bit. Pertanto, la cifra più significativa è il numero 7. Pertanto, byte contiene i valori da -2 alla 7a potenza a 2 alla 7a potenza meno 1 del risultato. Quali altri tipi primitivi ci sono:
Java: bit e byte - 17
Come possiamo vedere dalla tabella, i tipi di dati in termini di quantità di dati occupati raddoppiano. Cioè short = 2 * byte e int = 2 * short. In realtà è facile da ricordare. Ricorda che byte = 8 bit. Viene ricordato anche il fatto che non può essere da meno. In inglese, un numero intero è chiamato intero. Il tipo primitivo da esso era chiamato abbreviazione int. C'è un numero intero regolare - int. Esiste una versione breve, breve, e una versione lunga, lunga. Di conseguenza, int occupa 32 bit (4 byte). La versione breve è 2 volte più piccola - 16 bit (2 byte) e la versione lunga è due volte più grande, ad es. 64 bit (8 byte). Quindi un int può memorizzare al massimo un numero di circa 2 miliardi e cento milioni. E a lungo può immagazzinare un massimo di circa 9 quadrilioni (una bella parola). Ricordando la vecchia battuta su come un programmatore alle prime armi pensa che ci siano 1000 byte in un kilobyte, e un programmatore completo crede che ci siano 1024 grammi in un chilogrammo, possiamo capire:
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
A proposito, un lettore attento potrebbe aver notato che nella foto ce ne sono solo 7 tipi. 8 il tipo primitivo è booleano. booleano è un tipo di dati booleano che ha solo due valori: vero e falso. Ma sorge la domanda: che taglia è? La specifica Java Virtual Machine e la sezione " 2.3.4. Il tipo booleano " ci risponderanno:
Java: bit e byte - 18
Cioè, solo un booleano occuperà la stessa quantità di un int. Se dichiariamo un array booleano, ogni elemento dell'array occuperà 1 byte. Questi sono tali miracoli :)

Conclusione

Ti suggerisco di familiarizzare con un paio di altri materiali da consolidare: #Viacheslav
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION