JavaRush /Blog Java /Random-FR /Java : bits et octets
Viacheslav
Niveau 3

Java : bits et octets

Publié dans le groupe Random-FR
Java : bits et octets - 1

Introduction

Si les gens comptent selon le système décimal, alors les ordinateurs comptent selon le système binaire. Et un programmeur doit comprendre comment parler à la fois aux gens et aux ordinateurs. Cet examen devrait aider dans cette affaire. Parfois, derrière l’évidence se cache tout un monde. Je propose de parler de ce monde. Par exemple, il y a 7 jours dans une semaine. Maintenant, répondons à la question : quel est le chiffre « 7 » ? ) Premièrement, il s’agit d’un nombre naturel entier (positif). C'est aussi un nombre décimal. Un nombre décimal est un nombre dans le système décimal. Quand on dit « système numérique décimal », cela signifie que le système numérique a une base de 10 . La base montre combien de chiffres peuvent être utilisés dans un système numérique donné pour représenter un nombre. Le compte à rebours part de zéro. En conséquence, pour représenter les nombres dans le système numérique décimal, nous utilisons des nombres de 0 à 9. C'est bien, mais nous devons compter non seulement jusqu'à 9, mais aussi au-delà. Comment être? Par exemple, le nombre 10. Pour écrire ce nombre, nous utilisons jusqu'à 2 chiffres. La position de chaque chiffre dans le système décimal est appelée position décimale. Les chiffres sont comptés de droite à gauche :
Java : bits et octets - 2
De plus, le nombre décimal peut être développé comme suit : 103 = 1*10^2 + 0*10^1 + 3*10^0
Java : bits et octets - 3
Le nombre augmente essentiellement de droite à gauche. C'est-à-dire qu'au début c'était 7, puis c'est devenu 10. Par conséquent, les chiffres sont comptés à partir de la droite, en commençant par zéro. A quoi ça sert tout ça ? C'est parce que nous ne sommes pas des ordinateurs. Et tandis que nous comptons en décimal (c’est-à-dire en base 10), les ordinateurs comptent en binaire (c’est-à-dire en base 2). Mais les règles qui s’appliquent dans ces systèmes numériques sont les mêmes.
Java : bits et octets - 4

Système binaire

Le système binaire est très similaire au système décimal, à la seule différence que la limite ici n'est pas 10, mais 2. Comparons avec un exemple. Comment représente-t-on 11 en binaire ? C’est très simple : il suffit de diviser le nombre décimal par base 2, c’est-à-dire de compter 11/2 dans une colonne. Exemple:
Java : bits et octets - 5
Ou voici un exemple de WikiHow :
Java : bits et octets - 6
Fait intéressant, nous pouvons représenter un nombre en binaire de la même manière qu'en décimal : 111 en binaire = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1.
Java : bits et octets - 7
Un exemple de conversion de binaire en décimal peut être vu dans le calculateur en ligne . Parlant du fait que les règles de fonctionnement dans les systèmes numériques sont les mêmes, regardons l'addition dans le système binaire :
Java : bits et octets - 8
Comme vous pouvez le constater, nous transférons les chiffres lors de l'addition de la même manière que dans le système décimal. L'analyse de l'addition peut être vue, par exemple, ici : À propos, le mot « décharge » est périodiquement mentionné. Et c'est quoi? Le lieu n’est qu’un « élément structurel » de représentation d’un nombre. C'est-à-dire que le nombre 10 est composé de deux chiffres : il nous faut 2 chiffres, 2 places, 2 éléments pour écrire ce nombre. Il est important que nous comprenions cela car dans le système de numération binaire, un chiffre est un peu . Le mot Bit vient de l'anglais "binary digit" , c'est-à-dire un nombre binaire. Il peut s'agir de 0 ou de 1. Mais tout comme nous lisons les nombres et les mots dans leur ensemble, et non lettre par lettre, les ordinateurs ne lisent pas un bit à la fois. Pour le « morceau » minimum d'informations traitées dans la RAM (la plus petite unité d'information adressable), une séquence de 8 bits est lue . Puisqu'il y en a 8, celui-ci est appelé un "octet". Et aussi - le mot le plus connu Byte . Pour mémoriser l'octet, vous pouvez rappeler que le mot poulpe (huit pattes) est traduit en anglais par poulpe. Autrement dit, voici exactement le même « octo » dans le titre :
Java : bits et octets - 9
Réfléchissons à quel est le nombre maximum que nous pouvons représenter sous forme de 8 bits ?
Java : bits et octets - 10
Et ici la question se pose : qu’en est-il des nombres négatifs ? Pour comprendre cela, parlons de la façon dont les octets sont représentés en Java
Java : bits et octets - 11

Java et octet

Comment se fait-il que nous puissions utiliser des nombres négatifs en Java ? C'est fait simplement. En Java, les octets sont signés. Le chiffre/bit le plus à gauche (également appelé « bit le plus significatif ») est une sorte de « marqueur » qui répond à la question : « Ce nombre est-il négatif ? Si la réponse est oui, alors le marqueur a la valeur 1. Sinon, il est 0. Regardons un exemple de la façon de transformer le nombre 5 en un nombre négatif 5 :
Java : bits et octets - 12
Sur la base de cette image, vous pouvez comprendre les limites dans lesquelles se situe une valeur d'octet :
Java : bits et octets - 13
Il est également clair que :
  • si on ajoute un à 127, on obtient -128.
  • si on soustrait un de -128, on obtient 127.
Ainsi, Byte en Java peut prendre une valeur de -128 à 127. On le rappelle, un octet est un octet. Et le chiffre maximum/bit le plus significatif a un numéro de série de 7, puisque nous comptons à partir de zéro. Dans ce cas, il est facile de rappeler qu'un octet est égal à -2 puissance 7 (limite inférieure) à 2 puissance 7 moins 1 (limite supérieure). Travailler avec le type de données lui-même est simple. Nous utilisons le compilateur Java en ligne « repl.it » comme « bac à sable » pour cet article. https://repl.it/langues/java. Par exemple, exécutons le code qui représentera une variable d'octet sous forme binaire sous forme de chaîne :
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'utilisation des octets est activement utilisée lorsque l'on travaille avec des flux d'E/S. Vous pouvez en savoir plus dans le tutoriel d'Oracle : " I/O Streams ". De plus, en Java, vous pouvez utiliser un littéral spécial pour spécifier la valeur sous forme de bits :
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java : bits et octets - 14

Manipulation des bits

En ce qui concerne les octets et les bits, on ne peut manquer de mentionner diverses manipulations de bits. L'opération la plus courante est probablement le décalage (décalage au niveau du bit ou bit-shift). Et tout cela parce que leur résultat présente des avantages pratiques évidents. Quel en est l'usage? Décaler vers la gauche de N positions équivaut à multiplier le nombre par 2N. Et un décalage vers la droite est similaire à la même division. Ainsi, 5<<2 == 5*Math.pow(2,2) Et pour comprendre pourquoi il en est ainsi, regardons cet exemple plus en détail :
Java : bits et octets - 15
La négation au niveau du bit NOT (Unary bitwise), qui est représentée par un tilde, inverse les bits. Il s'écrit sous forme de tilde, par exemple ~5.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
Cela montre une fois de plus que lorsque Java change le signe d'un nombre, en plus d'inverser les valeurs des bits à la toute fin, nous effectuons +1. Et sans cela, comme on le voit, notre chiffre 5 change. Et pour qu'il reste le même numéro qu'avant de changer de signe, il faut faire +1. Bitwise AND vous permet de laisser deux nombres différents avec la valeur 1 pour un bit uniquement si tous les bits ont la valeur un. Ce qui est intéressant à ce sujet, c'est peut-être que cela présente certains avantages en termes d'application :
int x=4;
System.out.println((x&1) != 1);
Ce code vérifie la parité du nombre x. Regardons un exemple :
Java : bits et octets - 16
En utilisant Bitwise AND et Bitwise OR ensemble, vous pouvez utiliser des masques :
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");
    }
  }
Voir « Options de masquage avec des opérateurs au niveau du bit en Java » pour plus de détails . La manipulation des bits est un sujet intéressant sur lequel des critiques, des articles et des livres distincts ont été rédigés. Et c’est à partir de là que commence le long chemin vers la cryptographie. Dans le cadre de cet examen, il convient de comprendre pourquoi cela fonctionne et comment. Pour plus d'informations sur les opérations sur les bits, je vous recommande de lire la critique de tproger : « À propos des opérations sur les bits ».

Types primitifs

Ainsi, un octet est un octet, soit 8 bits. Il est facile de se rappeler qu’en Java, il existe également 8 types primitifs, par coïncidence. Un type primitif est un type de données intégré à un langage de programmation, c'est-à-dire disponible par défaut. byte est le plus petit type de données primitif en termes d'empreinte mémoire avec lequel Java peut fonctionner. Comme nous l'avons dit précédemment, un octet occupe 8 bits. Par conséquent, le chiffre le plus significatif est le numéro 7. Par conséquent, l'octet contient les valeurs de -2 à la puissance 7 à 2 à la puissance 7 moins 1 du résultat. Quels sont les autres types primitifs :
Java : bits et octets - 17
Comme nous pouvons le voir dans le tableau, les types de données en termes de quantité de données occupées doublent. Autrement dit, short = 2 * octet et int = 2 * short. C'est en fait facile à retenir. N'oubliez pas que l'octet = 8 bits. On se souvient également du fait qu’il ne peut pas être inférieur. En anglais, un entier s'appelle un entier. Le type primitif qui en découle s'appelle l'abréviation int. Il existe un entier régulier - int. Il existe une version courte, courte, et une version longue, longue. En conséquence, int occupe 32 bits (4 octets). La version courte est 2 fois plus petite - 16 bits (2 octets), et la version longue est deux fois plus grande, c'est-à-dire 64 bits (8 octets). Ainsi, un int peut tout au plus stocker un nombre d'environ 2 milliards et cent millions. Et long peut stocker un maximum d'environ 9 quadrillions (un joli mot). En nous souvenant de la vieille blague selon laquelle un programmeur débutant pense qu'il y a 1 000 octets dans un kilo-octet, et qu'un programmeur complet pense qu'il y a 1 024 grammes dans un kilogramme, nous pouvons comprendre :
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
D’ailleurs, un lecteur attentif aurait peut-être remarqué qu’il n’y a que 7 types sur la photo. Le type primitif 8 est booléen. boolean est un type de données booléen qui n'a que deux valeurs : vrai et faux. Mais la question se pose : quelle est sa taille ? La spécification de la machine virtuelle Java et la section " 2.3.4. Le type booléen " nous répondront :
Java : bits et octets - 18
Autrement dit, seul un booléen prendra le même montant qu'un int. Si nous déclarons un tableau booléen, alors chaque élément du tableau occupera 1 octet. Ce sont de tels miracles :)

Conclusion

Je vous suggère de vous familiariser avec quelques matériaux supplémentaires à consolider : #Viacheslav
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION