web-dev-qa-db-fra.com

Pourquoi apprendre l'hexadécimal?

J'ai pris pas mal de cours de programmation d'introduction dans ma journée, principalement pour me mouiller les pieds dans tous les types de programmation que je trouve. Sans surprise, à peu près toutes les classes passent par le même format: introduction au matériel, introduction au logiciel, puis vous entrez dans la programmation proprement dite. Bien qu'il soit très important de comprendre le fonctionnement du matériel et des logiciels, j'ai toujours été confus par un sujet qui a été abordé dans chaque cours.

Dans la section d'introduction au logiciel que j'ai trouvée, sans faute, ils mettent toujours l'accent sur la maîtrise des systèmes de nombres binaires, hexadécimaux et parfois même octaux. Je comprends qu'il est bon de comprendre ce que sont ces choses et comment un ordinateur les interpréterait, mais je ne me suis jamais trouvé réellement obligé de savoir lire et écrire l'un de ces systèmes numériques. Vraiment, la seule fois où j'ai vu autre chose que la base 10, c'est pour les couleurs en CSS, ce qui est encore plus facile si vous utilisez quelque chose comme www.colorpicker.com

Ai-je simplement ignoré les merveilleuses utilisations de ces systèmes numériques non base-10 dans le monde de la programmation, ou est-ce simplement une vieille tradition d'inclure ces sections dans tous les manuels de programmation? Quelqu'un at-il un bon exemple de l'endroit où le programmeur moyen utiliserait réellement un nombre octal?

28
jwegner

Toutes les réponses sont bonnes, mais elles n'abordent pas ce que je pense être la partie la plus précieuse. Apprendre à "penser" dans différentes bases vous rend beaucoup plus à l'aise avec la façon dont les ordinateurs traitent les nombres.

Si vous vouliez stocker une chaîne de lettres minuscules assez bien emballée, comment feriez-vous?

Eh bien, il y a 26 lettres minuscules, qui se traduisent facilement en une plage de 0 à 31 qui est un nombre de 5 bits, vous pouvez emballer 6 nombres de 5 bits dans un champ de 32 bits (int?) Et même en avoir suffisamment pour quelques signes de ponctuation.

Je ne dis pas que hex aide à des choses comme ça, mais comprendre comment les nombres se convertissent.

Un autre cas, de temps en temps, vous utilisez la base-64 pour passer des nombres assez longs en ascii. Souhaitez-vous savoir comment mettre en œuvre cela? Pourquoi le mettre en œuvre de cette façon? Saviez-vous même que c'est ce que vous tapiez à chaque fois que vous tapiez la "CLÉ CD" dans la boîte d'enregistrement d'un jeu?

Aussi, pour le plaisir, jouez avec la base 12 pendant un certain temps. Les mathématiques s'avèrent vraiment intéressantes en base 12 (la base 10 est stupide en comparaison, j'aurais aimé que nous évoluions avec 6 doigts - nous pourrions avoir des décennies d'avance dans notre compréhension des mathématiques). Certains premiers humains très intelligents ont utilisé la base 12 pour développer l'horloge.

Dans la base 10, nous avons 3 nombres "Cool" qui créent des motifs faciles, 2, 5 et 9 avec 8, 6 et 4 comme nombres cool "Minor". Dans la base 12, vous avez 2,3,4,6,11 en tant que nombres "cool" avec 8,9 et 10 en tant que nombres cool "mineurs", ce qui signifie que si nous utilisions la base 12, nous serions beaucoup mieux à reconnaître les modèles dans les nombres parce que nous les verrions tout le temps.

Aussi, binaire. Vous pouvez compter sur une main pour 32 - je le fais un peu, est parfois utile lorsque le comptage sur 5 ne suffit pas :)

Le binaire est très amusant, mais il ne se traduit tout simplement pas bien. Lorsque vous vous sentez bien avec l'hex, vous commencez à voir "A" comme 1010 et "5" comme 0101, et ces choses commencent vraiment à avoir de l'importance. Si vous avez un champ de bits dont vous voulez extraire le 6e bit: 00100000, avec quoi "et" le faites-vous? Vous devez juste savoir que c'est 0x20.

Si vous voyez du code avec quelque chose avec 0x0600, quels bits sont extraits? Vous devriez savoir sans même y penser - vous devriez en fait lire cela comme s'il était écrit 0000011000000000 (mais plus facile à lire car vous n'avez pas à compter les zéros).

Pourquoi voudriez-vous limiter votre cerveau et sa capacité à traiter des données?

14
Bill K

Que faut-il apprendre? Vous devez comprendre différentes bases numériques pour être un programmeur compétent, mais en ce qui concerne l'hex, il y a peu à apprendre, sauf que ABCDEF vient après 9.

44
Neil Butterworth

Quelqu'un at-il un bon exemple de l'endroit où le programmeur moyen utiliserait réellement un nombre octal?

Octal? Pas généralement, non, à l'exception des autorisations * nix.

Hexadécimal? Tu paries. Vous ignorez le nombre assez important d'entre nous qui mélangent des bits autour des systèmes embarqués, examinant les protocoles ou les formats de fichiers au niveau du bit, et cetera. Mais bien sûr, si vous êtes loin du métal en train de faire des applications ou du travail sur le Web, vous pourriez vous en sortir plus facilement.

Exemple: les registres de configuration sur les microcontrôleurs et similaires.

Prenez le numéro 54312, pris en frappant des touches au hasard. Pouvez-vous dire quels bits sont définis? Je ne peux pas, du moins pas du haut de ma tête. L'équivalent hexadécimal alors, c'est 0xd428. That d'autre part, me dit tout de suite que le modèle de bits que je regarde est 1101 0100 0010 1000. Il est plus logiquement structuré pour ce genre de chose, et vous vous retrouvez en ayant besoin de tout cela moment où vous êtes proche du métal. Disons que le nombre ci-dessus est ce que j'obtiens lors de la réinitialisation du mcu, et que j'ai besoin des bits 7 et 9 définis pour une raison quelconque. En hexadécimal, je peux facilement voir que le nombre résultant devrait être 0xd6a8, mais en décimal? C'est 54952, loin d'être aussi intuitif si vous me le demandez. Bien sûr, il s'agit d'ajouter 640 à la valeur, mais c'est plus difficile à comprendre. Bien sûr, dans la pratique, on peut simplement déplacer les bits à la bonne position et OR cela avec la valeur d'origine, mais vous voudrez peut-être tout de même savoir quelle est la représentation finale.

18
n42

Quelqu'un at-il un bon exemple de l'endroit où le programmeur moyen utiliserait réellement un nombre octal?

Si vous définissez des autorisations sur un fichier sous Unix (ou Linux), vous utilisez un nombre octal à 3 chiffres. Le premier chiffre correspond aux autorisations de l'utilisateur, le second aux autorisations du groupe et le dernier chiffre aux autorisations accordées à tout le monde.

J'ai dû comprendre ce fait dans le code que j'ai écrit la semaine dernière.

Si vous regardez la sortie d'algorithmes de hachage standard comme MD5, vous les trouverez souvent écrits en hexadécimal. J'ai vu un certain nombre de cas où cela a conduit à l'arithmétique dans des bases inhabituelles.

Si vous voulez comprendre comment la virgule flottante est représentée en interne, et donc pourquoi 1/10 n'est pas représenté avec précision, vous devez absolument comprendre comment faire de l'arithmétique dans différentes bases. Il s'agit d'une connaissance ésotérique jusqu'au jour où elle vous mord à l'arrière et soudain, vous devez réellement la comprendre rapidement.

Et il y a tonne d'autres cas où vous découvrirez la nature binaire fondamentale des données à l'intérieur des ordinateurs. Bien sûr, si vous écrivez simplement un site Web CRUD, vous n'en rencontrerez probablement aucun car cela se produit à des niveaux que quelqu'un d'autre a déjà traités.

12
btilly

Espérons que dans le monde réel, vous ne serez pas interrogé sur la conversion de Hex en binaire en décimal. Vous aurez des outils à votre disposition pour convertir comme bon vous semble.

Je suis d'accord que vous devriez comprendre ce qui se passe, mais pourquoi mémoriser quand vous pouvez le rechercher?

Cependant, j'ai trouvé utile de se souvenir des nombres clés (pour moi 0x64 = 100, 0xFF = 255, 0xFFFF = 65535, etc.) car ils reviennent beaucoup.

Puis-je expliquer ce que 8675309 est en binaire, hexadécimal et octal? Non, mais je peux ouvrir un outil qui le peut quand j'en ai besoin.

9
Dylan Yaga

La seule chose pour laquelle j'ai jamais utilisé l'octal est les autorisations de fichiers sur les systèmes Unix.

Hex et binaire sont très utiles si vous travaillez avec des protocoles proches du fil ou proches du transfert de données métalliques. Fondamentalement, les données circulent en binaire, qui est trivialement représenté grignoter à la fois en hexadécimal.

Vous constaterez également que les fiches techniques citent souvent des valeurs hexadécimales, il est donc préférable d'afficher la valeur dans le code telle qu'elle apparaît dans la feuille de données.

Si vous utilisez beaucoup l'un d'eux, vous finissez par être assez compétent pour convertir vers et à partir de la décimale dans votre tête, au moins pour les valeurs courantes.

Tout cela dit; Je soupçonne que l'accent mis est principalement historique. Comme vous le dites, il y a beaucoup de programmeurs qui ont peu besoin d'autre chose que de la décimale.

5
Luke Graham

Vous demandez en fait pourquoi apprendre la puissance de 2 représentations numériques?

Les ordinateurs sont constitués de circuits, le courant électrique circule à travers les circuits en deux niveaux différents, haut et bas pour représenter les deux niveaux de courants, nous utilisons des chiffres binaires car ils peuvent contenir deux états, soit l'un (élevé ) ou zéro (faible).

Les chiffres binaires forment des modèles. Par exemple, si la seule façon dont vous et moi pouvons parler, c'est à travers un circuit, nous pouvons établir que si vous voulez m'envoyer la lettre A, vous m'enverrez le modèle binaire: 1000001. Puisque je suis - paresseux, je ne veux pas mémoriser les 7 sept chiffres. Au lieu de cela, j'utiliserai une puissance de 2 système de numérotation pour représenter les gros chiffres binaires en un plus petit. Je peux utiliser 8 (2 ^ 3) ou 16 (2 ^ 4).

Comme vous pouvez le voir, la plupart des matériels et logiciels informatiques utilisent une représentation binaire et nous, les humains, utilisons la puissance de 2 représentations comme octale et hexadécimale pour lire la représentation binaire de manière plus efficace et indolore.

Maintenant exemple du programmeur moyen qui a besoin de comprendre la puissance de 2 représentations:

  1. ASCII
  2. Unicode
  3. Comprendre la programmation de la gestion de la mémoire (pile, tas, adresses mémoire, vidages mémoire)
  4. Débogage
  5. La lecture des données binaires se fait principalement dans l'éditeur Hex.

Maintenant mes deux derniers cents, je suis très confiant que vous pouvez apprendre assez rapidement n'importe quelle puissance de 2 représentations (puisque vous avez déjà géré des cours de programmation d'introduction). Vous pourriez oublier la conversion, mais ce ne devrait pas être un concept étranger si vous le souhaitez être un programmeur moyen.

5
Armando

Je n'ai jamais utilisé octal, mais il n'est pas rare de voir hex dans le débogueur et à l'occasion, il est beaucoup plus logique d'utiliser hex dans votre code source (normalement, car les données sous-jacentes sont des indicateurs de bits.)

3
Loren Pechtel

Je ne sais pas s'il y a beaucoup de besoins de nos jours, mais il y a de nombreuses années, quand j'étais programmeur système, il était essentiel de pouvoir lire et comprendre hex. Je serais présenté avec un vidage de stockage (tout en hexadécimal) et décoder la représentation hexadécimale dans le langage IBM Assembly. Après avoir fait cela pendant un certain temps, vous finissez par pouvoir le faire directement - lisez l'hexagone et écrivez l'équivalent d'assemblage. Très pratique pour le débogage. L'ajout et la soustraction de valeurs hexadécimales ont été utiles pour calculer les décalages à partir des registres de base.

Je soupçonne qu'il est peu nécessaire dans la pratique maintenant, mais sa connaissance ne peut guère être une mauvaise chose.

3
Simon Knights

Il ne s'agit pas d'être "fluide" en lecture binaire/hexadécimal, mais suffisamment confortable pour que vous puissiez rapidement faire une conversion mentale lorsque vous les rencontrez. Imaginez la programmation sans être à l'aise avec l'arithmétique simple, et vous deviez aller à une calculatrice chaque fois que vous deviez multiplier par deux.

Hexadécimal/binaire est important car c'est le langage dans lequel les ordinateurs parlent. Vous le rencontrerez invariablement à certains endroits, en particulier lors des exercices de débogage et vos données sont en hexadécimal.

Je voudrais également souligner l'importance de comprendre la base 2 dans le contexte de la façon dont les différents types numériques sont représentés en interne et comment fonctionne l'arithmétique. Avec cela, vous aurez une meilleure compréhension du moment et de la façon de traiter les problèmes d'arrondi en virgule flottante et le dépassement d'entier, par exemple.

Comme autre exemple, les opérations au niveau du bit et les indicateurs de bit sont toujours répandus dans la programmation, et c'est un autre endroit où la compréhension de la base-2 est importante.

3
Scott Wegner

Vraiment, la seule fois où j'ai vu autre chose que la base 10, c'est pour les couleurs en CSS,

Vous n'avez jamais eu à rechercher un caractère dans les tableaux de code Unicode ? Je n'ai jamais vu d'URL contenant %20 dedans? Jamais utilisé un GUID ? Jamais vu un adresse IPv6 ? Jamais écrit un littéral BLOB en SQL? Jamais consulté un fichier dans un éditeur hexadécimal? Il y a beaucoup de choses liées à l'ordinateur qui sont notées de façon conventuelle en hex.

Quant à octal, il est rare de nos jours, mais toujours utilisé pour les autorisations du système de fichiers Unix.

Voir aussi: applications pratiques des opérations au niveau du bit

Même si vous êtes en mesure d'éviter de faire une programmation "proche du fil", il est toujours important d'être conscient du fait que les ordinateurs fonctionnent en binaire, pour une raison simple: fuite des abstractions .

L'abstraction int dans la plupart des langues fait fuir sa nature de largeur fixe. Les entiers débordent, et ils le font à des nombres binaires "ronds" comme 231. Un penseur décimal ne serait pas en mesure d'expliquer le bug de l'an 2038 .

L'abstraction float/double fait fuir sa base de 2. Si vous écrivez 0.1, vous obtenez vraiment 0.1000000000000000055511151231257827021181583404541015625. Et vous obtiendrez des bogues si vous vous attendiez à un 0,1 exact.

2
dan04

Reconnaître des nombres particuliers dont les modèles sont simples dans d'autres bases est souvent un énorme indice lors de la résolution de bogues. Si votre réponse est fausse en 347, cela ne signifie peut-être rien, mais si elle est désactivée en 256 ou 128, cela signifie peut-être quelque chose. Si vous mettez -1 dans un type de données 16 bits non signé, vous obtenez 65535, soit 1 de moins que 65536. Si vous connaissez par hasard 2 ^ 16, vous repérez immédiatement votre problème.

Quant à octal, jetez un oeil à ces questions et voyez si reconnaître octal lorsque vous le demandez accidentellement aurait fait de ces personnes de meilleurs programmeurs.

2
Kate Gregory

Il existe des techniques mathématiques et de compression de données très efficaces que vous pouvez utiliser lorsque vous comprenez ces systèmes et comment ils fonctionnent. Vous ne les utiliserez probablement pas beaucoup dans vos premiers travaux. Mais les avoir dans votre poche arrière lorsque vous devenez un senior et qu'on vous demande de faire fonctionner le système hérité surmené sur le serveur de dinosaures surmené sous-alimenté est agréable à avoir.
Cela devient plus important lorsque vous traitez avec des contrôleurs et des appareils électroniques qui n'ont pas d'api. Surtout si vous écrivez cette API.

1
SoylentGray

En introduction aux cours de programmation qui font partie des études en informatique, il est très logique de bien connaître ce matériel. Vous revisitez le sujet lors de la programmation en langage assembleur, lors de la conception de matériel, en suivant un cours sur les langages formels, etc. Tous les ingénieurs électriciens de mon université ont besoin d'un cours d'introduction à la programmation et ils continueront probablement à utiliser ces informations. En dehors de cela, pas terriblement important.

1
Peter Smith

Les nombres octaux sont parfois utiles pour les jeux de caractères. Ces derniers sont basés sur des octets et un octal = 8 bits = un octet. En UTF-8, par exemple, les caractères non ASCII peuvent avoir deux octets ou plus; les nombres octaux sont plus pratiques pour les représenter que les nombres hexadécimaux.

Les bits sont utiles parce que ... hé! Vous savez que votre ordinateur traite constamment des 0 et des 1, n'est-ce pas? Je veux dire sérieusement ... Il ne s'agit pas simplement de plaisanter que les informaticiens sont les seuls à savoir que 1 + 1 = 10. Il est également utile pour les opérateurs liés aux bits ou comme varbits. Ces derniers permettent de réduire les besoins de stockage dans les bases de données lorsqu'il s'agit de séries de drapeaux.

En ce qui concerne l'hexadécimal, je suppose que vous n'avez jamais ouvert d'éditeur hexadécimal pour augmenter les statistiques et l'équipement de votre personnage RPG. Si vous l'aviez fait au lieu de télécharger un éditeur de caractères, vous sauriez très bien pourquoi il est pratique de pouvoir comprendre les nombres hexadécimaux. ;-)

1

J'ai obtenu mon diplôme universitaire il y a 3 ans, et je pense qu'il est très important de pouvoir lire et écrire des nombres hexadécimaux. Je joue avec beaucoup de gros fichiers XML pour le travail (gros sens 100 Mo +). Parfois, vous obtiendrez un fichier XML contenant un caractère XML non valide, qui ne peut être affiché dans aucun éditeur de texte, j'ai donc dû utiliser l'éditeur Hex et écrire du code pour localiser les caractères non valides. Cette tâche serait très difficile sans connaître le nombre hexadécimal.

1
Alvin

Il y a de nombreuses années, j'ai appris la valeur de l'hex en travaillant sur des systèmes 8 bits.

La clarté de comprendre que quelque chose était situé au B000 ou E7FF était incroyable.

Hier, j'avais besoin de savoir exactement quels étaient les caractères à la fin d'une ligne de texte. Connaître la différence entre 0x0A et 0x0A 0x0D peut être très important.

1
Scott Bruns

Quelqu'un at-il un bon exemple de l'endroit où le programmeur moyen utiliserait réellement un nombre octal?

Octal ces jours-ci est assez rare, mais j'utilise hex très fréquemment, et je pense souvent aux problèmes en binaire.

Je programme principalement en C et C++, avec un peu d'Objective C, et je fais beaucoup de travail avec des graphiques raster et vectoriels sous Linux et Mac OS X. Dans ces domaines, il est primordial d'écrire du code qui fonctionne efficacement et fait bon usage du stockage. Vous devez également comprendre la façon dont les machines représentent en interne ce avec quoi vous travaillez. La façon la plus pratique de voir cela est en hexadécimal. Par exemple, un pixel couleur standard de 24 bits est représenté sur trois octets, et savoir en un coup d'œil que 0x000000 est noir, 0x00FF00 est rouge et 0x008000 est rose est vraiment, vraiment utile!

Je travaille également beaucoup avec les normes internationales pour les formats de fichiers. L'un de ceux avec lesquels j'ai travaillé récemment est MXF, qui est utilisé pour stocker des vidéos pour la diffusion, des DVD, etc. C'est un format binaire, et encore une fois, il est plus facile à gérer en utilisant hexadécimal ou parfois binaire. Lorsque vous déboguez la raison pour laquelle certaines vidéos basées sur MXF ne sont pas lues directement sur votre système, il est vraiment pratique de pouvoir regarder un champ 32 bits et de réaliser que le bit pour masquer l'écran est défini par inadvertance - et vous pouvez le faire que dans l'hex, mais c'est à peu près impossible en base 10.

Si vous allez passer votre carrière à écrire du Perl pour masser des chaînes de texte, alors non, vous n'avez probablement pas besoin d'être très familier avec l'hex, l'octal ou le binaire. Mais au moment où vous commencez à traiter le genre de choses que je fais, hexadécimal et binaire au moins sont essentiels.

1
Bob Murphy

Je pense que la conversion en tant que telle d'une base à une autre n'est pas très importante pour la programmation. En programmation de haut niveau, vous n'avez pas besoin des conversions (et vous pourriez le faire, les fonctions lib et la calculatrice sont disponibles.) Lorsque vous plongez dans la programmation de niveau inférieur, vous n'êtes plus dans un cours d'introduction.

Je pense que deux questions (liées) sont importantes à couvrir dans un cours de base.

  1. À propos de l'encodage. Il ne s'agit pas de conversion mathématique, mais d'utiliser des nombres (tout type de nombres) pour stocker des informations (tout type d'informations). Vous pouvez illustrer cela avec du code morse ou Paint by numbers, si vous le souhaitez. Mais comme les ordinateurs utilisent plutôt le binaire et que le binaire est généralement affiché sous forme hexadécimale, les choses sont généralement illustrées par des exemples hexy. (Et, pendant qu'ils y sont, ils pourraient expliquer un peu les fins de ligne, qui ont été mentionnées dans cette rubrique. Je ne conseillerais que de reconnaître les diverses formes et formes que cela pourrait prendre, certaines d'entre elles sont 0x0D, 0x0A , CRLF, '\ n' et '\ r')

  2. Problèmes de débordement. Encore une fois, il n'est pas nécessaire d'illustrer cela avec hex. Vous pouvez utiliser l'exemple y2k (qui n'a rien à voir avec l'hexagone). Ici aussi, je conseillerais simplement de reconnaître les différents indicateurs les plus probables (255, 32767, 65535, 2M14). Pourquoi ce sont des indicateurs est directement lié à la nature bytewise de stockage interne, mais la conversion n'est pas la partie importante.

Je ne suis pas d'accord sur le fait que vous devez le savoir pour les bitflags (car dans un cours d'introduction à la programmation, les constantes nommées sont beaucoup plus instructives et utiles.)

0
Inca

Si vous entrez dans la programmation intégrée de bas niveau, vous utiliserez hexadécimal. Il est utilisé pour des choses comme la spécification de modèles de bits dans les registres matériels et les valeurs d'octets dans les vidages de mémoire. Vous apprendrez également à utiliser chaque opérateur bit par bit dans le langage de programmation que vous utilisez.

0
mkClark

Vous devez savoir hexadécimal si vous voulez être programmeur. Il serait tout simplement trop gênant pour vous de devoir admettre au travail le rare jour où vous devez le savoir que vous ne le comprenez pas.

Cela ne signifie pas que vous devez être capable d'ajouter des nombres hexadécimaux dans votre tête. Cela commence à vous gâcher les règles de l'ajout régulier si vous le faites de toute façon. :)

0
John Robertson

Ce que le binaire, l'hex et l'octal ont en commun n'est pas qu'ils ne sont pas en base10, mais qu'ils sont tous des pouvoirs de deux. Étant donné que les ordinateurs sont intrinsèquement binaires, cela donne à chacun d'eux une application où ils sont le moyen le plus approprié ou efficace pour afficher et traiter les données.

Cela était très important, à l'époque où toute la programmation était de bas niveau. Dans la programmation de haut niveau, aujourd'hui, les systèmes de puissance à 2 sont beaucoup moins importants. Avoir une introduction approfondie à eux dans chaque cours de programmation pourrait être une relique de l'ancien temps.

Mais ces systèmes numériques ont toujours leur utilité, même lorsque vous travaillez dans des langues de haut niveau. La couleur, par exemple, est toujours stockée en 24 bits, 8 bits par couleur primaire. Et puisque l'hexadécimal est le meilleur moyen de représenter un octet de manière lisible par l'homme, il fait même partie du CSS, qui est censé être utilisable par des personnes qui n'ont jamais eu d'initiation à la programmation.

Vous ne pouvez pas comprendre les ordinateurs sans comprendre le binaire. Une introduction au binaire est une partie nécessaire de toute introduction approfondie à la programmation. Vous n'avez peut-être pas besoin de faire beaucoup de conversions entre les systèmes numériques dans le travail quotidien, mais faire des exercices comme celui-ci est le seul moyen de vraiment vous familiariser avec ces systèmes numériques *. Connaître plusieurs systèmes non basés sur 10 numéros est le seul moyen de bien comprendre que les données peuvent être représentées de plusieurs manières, toutes valides.

  • Comme John von Neumann l'a dit: "[...] nous ne comprenons pas les choses, nous nous y habituons."
0
Waquo