"Il n'y a rien de mieux qu'un codage efficace, Amigo ! Faites confiance à un vieux robot."

« Parlez-vous des chiffres utilisés par les espions ?

"Bien sûr que non. Je parle de présenter des informations sous une forme assimilable. À propos des systèmes numériques. Vous savez que dans la vie de tous les jours, la plupart des gens utilisent le système décimal. Il utilise 10 symboles pour représenter chaque nombre : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Il y a 10 chiffres, donc le système est appelé décimal."

"C'était pratique pour les humains avec leurs dix doigts. Mais les programmeurs sont de grands inventeurs. Ils ont immédiatement trouvé des encodages qui utilisent un nombre différent de chiffres. Par exemple, 2, 8, 16 ou 64 chiffres. Ils l'ont fait pour rendre pratique pour les ordinateurs, qui s'appuient sur 'il y a un signal / il n'y a pas de signal'."

"Ah, je vois ce qu'ils ont en commun... Tous ces systèmes sont basés sur des puissances de deux.

Encodage octal

"Bonne observation. Commençons par un encodage à 8 chiffres. Les humains trouveront peut-être cela le plus simple : il suffit de supprimer les chiffres 8 et 9 et - boum - vous avez l'encodage octal (système numérique). On vous a récemment parlé des littéraux, n'est-ce pas ? ?"

"Oui."

"Eh bien, surprise ! Vous pouvez définir des littéraux numériques encodés à l'aide du système octal. Si, bien sûr, vous en avez vraiment besoin. C'est plus facile qu'il n'y paraît. Mettez simplement 0 devant le nombre entier.

"Donc , si un littéral numérique commence par zéro, cela signifie-t-il qu'il est octal ?"

"Oui, Java le traitera comme octal.

Exemples:

Code Remarques
int x = 015;
x est 13 : 1*8+5
int x = 025;
x est 21 : 2*8+5
int x = 0123;
x vaut 83 : 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
Cela ne compilera pas : 8 n'est pas l'un des symboles utilisés dans l'encodage octal.

"Il est peu probable que vous ayez besoin d'écrire des nombres octaux dans votre code, mais vous devez savoir ce qu'ils sont. "Après tout, vous devrez lire du code écrit par d'autres. Et comme mentionné ci-dessus, les programmeurs sont de grands inventeurs.

Eh bien, rappelez-vous que vous ne pouvez pas simplement écrire 0 devant chaque nombre."

"Mais si j'ai l'intention qu'il soit octal, alors je peux ?"

"Oui.

Encodage binaire

"Même si vous ne le comprenez pas encore, l'encodage binaire est votre langue maternelle. Laissez-moi vous le rappeler. Si l'octal n'a que les chiffres 0-7, alors le binaire n'a que 0 et 1."

« Pourquoi cet encodage est-il nécessaire ? »

"Comme je l'ai mentionné ci-dessus, cela a tout à voir avec la structure interne d'un ordinateur. Tout dans un ordinateur fonctionne à l'électricité, et il se trouve que le moyen le plus efficace de stocker et de transmettre quelque chose en utilisant l'électricité est d'utiliser deux états : soit il n'y a pas d'électricité dans le fil (zéro) et il y a de l'électricité (un)."

"C'est pourquoi il est si populaire... Hmm, il semble que je commence effectivement à me souvenir de cette langue !"

"Tous les robots le comprennent parfaitement. Bien qu'il ne soit pas très souvent utilisé en Java. Java est considéré comme un langage de haut niveau, complètement abstrait du matériel sur lequel il s'exécute. En effet, vous souciez-vous vraiment du format utilisé pour stocker et traiter les données à l'intérieur d'un ordinateur ?

"Mais au cours des dernières décennies, les programmeurs en sont venus à aimer l'encodage binaire (et d'autres encodages basés sur celui-ci). En conséquence, Java a des opérateurs qui prennent des nombres binaires comme entrées. Et la précision des nombres à virgule flottante dépend de leur binaire. représentation.

"En bref, il vaut mieux que vous connaissiez cet encodage que de ne pas le savoir."

"Bien. Et comme c'était le cas avec l'encodage octal, Java a un moyen d'encoder les littéraux en utilisant le système binaire."

"Alors ils ne seront composés que de 0 et de 1 ?"

"Exactement. Pour que le compilateur Java comprenne que le code contient un littéral numérique encodé en binaire plutôt qu'un simple nombre décimal composé de zéros et de uns, il est d'usage que tous les littéraux binaires commencent par le préfixe 0b (le ' b ' vient du mot binaire).

Exemples:

Code Remarques
int x = 0b100; 
х vaut 4 : 1*4+0*2+0
int x = 0b1111;
х vaut 15 : 1*8+1*4+1*2+1
int x = 0b1111000111; 
х vaut 967 : 1*2 9 +1*2 8 +1*2 7 +1*2 6 +0*2 5 +0*2 4 + 0*2 3 + 1*2 2 + 1*2+1 ;
int x = 0b12000;
Cela ne compilera pas : 2 n'est pas l'un des symboles utilisés dans l'encodage binaire.

Encodage hexadécimal

« Qu'est-ce que deux à la puissance quatre ? »

« Seize ans. Tu as trouvé la bonne question à poser à un robot qui est venu aussi loin que moi !

"Il vous semble que vous êtes venu de loin. Quoi qu'il en soit, seize ans. En plus des codages octal et binaire, les littéraux peuvent également être écrits en hexadécimal. C'est un codage très populaire.

"C'est parce que bien que la notation binaire soit aussi proche que possible de la façon dont les nombres sont réellement stockés, il est trop difficile pour les humains de travailler efficacement avec de tels nombres : en binaire, le nombre un million à 20 chiffres, pas 7.

"C'est pourquoi les programmeurs ont inventé le système hexadécimal. Après tout, comme vous l'avez correctement noté, 16 est 2 élevé à la puissance 4, donc exactement 4 bits correspondent à un chiffre hexadécimal.

"Ainsi, tous les 4 bits peuvent désormais être écrits en un seul chiffre hexadécimal."

"Bien. L'encodage hexadécimal a également son propre préfixe unique : 0x . Exemples :

Nombre décimal Notation binaire Notation hexadécimale
17 0b 0001 0001 0x 1 1
4 1 0b 0010 1 00 1 0x 2 9
85 0b 0101 0101 0x 5 5
256 0b 1 0000 0000 0x 1 0 0

"Ok, donc c'est assez clair comment on a obtenu le système octal : on vient de jeter les nombres 8 et 9. Mais où trouve-t-on les 6 chiffres manquants pour le système hexadécimal ? J'aimerais bien les voir !"

"Tout est simple. Les 6 premières lettres de l'alphabet anglais ont été prises comme les 6 chiffres manquants : A (10), B (11), C (12), D (13), E (14), F (15) .

Exemples:

Notation hexadécimale Notation binaire Nombre décimal
0x 1 0b 0000 0001 1
0x 9 0b 0000 1001 9
0x A 0b 0000 1010 dix
0x b 0b 0000 1011 11
0xC _ 0b 0000 1100 12
0x J 0b 0000 1101 13
0xE _ 0b 0000 1110 14
0xF _ 0b 0000 1111 15
0x 1F _ 0b 0001 1111 31
0x A F 0b 1010 1111 175
0x F F 0b 1111 1111 255
0x F F F 0b 1111 1111 1111 4095

"Comment convertir un nombre hexadécimal en décimal ?"

"C'est très simple. Disons que vous avez le nombre 0 x A F C F . Combien cela fait-il en décimal ? Premièrement, nous avons un système de numérotation positionnel, ce qui signifie que la contribution de chaque chiffre au nombre total augmente d'un facteur de 16 en passant de droite à gauche :

UNE * 16 3 + F * 16 2 + C * 16 1 + F

Le symbole A correspond au chiffre 10, la lettre C indique que nous avons le chiffre 12 et la lettre F représente quinze. On a:

10 * 16 3 + 15 * 16 2 + 12 * 16 1 + 15

En élevant 16 aux différentes puissances qui correspondent aux chiffres, on obtient :

10 * 4096 + 15 * 256 + 12 * 16 + 15

On résume tout et on obtient :

45007

"Maintenant, vous savez comment 45007 est stocké en mémoire."

"Oui, je le sais. C'est 0x A F C F "

"Maintenant, convertissons-le en binaire. En binaire, ce serait :

0b 1010 1111 1100 1111

"Chaque ensemble de quatre bits correspond exactement à un caractère hexadécimal. C'est super pratique. Sans aucune multiplication ni exponentiation."