Question

Hé! Je regardais ce code à l'adresse http://www.gnu.org/ logiciel / m68hc11 / exemples / primes_8c-source.html

J'ai remarqué que dans certaines situations, ils utilisaient des nombres hexadécimaux, comme dans la ligne 134:

for (j = 1; val && j <= 0x80; j <<= 1, q++)

Maintenant, pourquoi utiliseraient-ils le 0x80? Je ne suis pas très bon avec hex mais j'ai trouvé un hex en ligne à décimal et il m'a donné 128 pour 0x80.

Aussi avant la ligne 134, à la ligne 114, ils ont ceci:

small_n = (n & 0xffff0000) == 0;

L'hex à décimal m'a donné 4294901760 pour ce nombre d'hex. Donc, ici, dans cette ligne, ils font un peu ET et comparent le résultat à 0 ??

Pourquoi ne pas simplement utiliser le numéro? Quelqu'un peut-il expliquer et donner des exemples d'autres situations?

J'ai aussi vu de grandes lignes de code où il n'y a que des nombres hexadécimaux et je n'ai jamais vraiment compris pourquoi: (

Était-ce utile?

La solution

Dans les deux cas que vous citez, la configuration de bits du nombre est importante, pas le nombre réel.

Par exemple, Dans le premier cas, j sera égal à 1, puis à 2, 4, 8, 16, 32, 64 et enfin 128 au fur et à mesure que la boucle progresse.

En binaire, c'est-à-dire

0000: 0001 , 0000: 0010 , 0000: 0100 , 0000: 1000 , 0001: 0000 , 0010: 0000 , 0100: 0000 et 1000: 0000 .

Il n'y a pas d'option pour les constantes binaires en C ou C ++, mais c'est un peu plus clair en Hex: 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 et 0x80 .

Dans le deuxième exemple, l'objectif était de supprimer les deux octets inférieurs de la valeur. Donc, étant donné une valeur de 1 234 567 890, nous voulons nous retrouver avec 1 234 567 168.
En hex, c'est plus clair: commencez par 0x4996: 02d2 , terminez par 0x4996: 0000 .

Autres conseils

Il existe une correspondance directe entre les chiffres hexadécimaux (ou octaux) et les modèles de bits sous-jacents, ce qui n'est pas le cas avec le nombre décimal. Un nombre décimal '9' représente quelque chose de différent en ce qui concerne les modèles de bits en fonction de la colonne dans laquelle il se trouve et des chiffres qui l'entourent - il n'a pas de relation directe avec un modèle de bits. Dans l'hex, un '9' signifie toujours '1001', peu importe la colonne. 9 = '1001', 95 = '* 1001 * 0101' et ainsi de suite.

En tant que vestige de mes jours de 8 bits, je trouve un hexagone commode pour tout ce qui est binaire. Bit twiddling est une compétence en voie de disparition. Une fois (il y a environ 10 ans), j'ai vu un article de réseautage de troisième année à l'université où seulement 10% (environ 5 sur 50) des membres de la classe pouvaient calculer un bit-mask.

c'est un peu masque. Les valeurs hexadécimales permettent de voir facilement la représentation binaire sous-jacente. n & amp; 0xffff0000 renvoie les 16 premiers bits de n. 0xffff0000 signifie "16 1s et 16 0s en binaire"

0x80 signifie " 1000000 ", vous commencez donc par & 00000001 " et continuez à déplacer ce bit vers la gauche "0000010", "0000100", etc. jusqu'à "1000000"

0xffff0000 est facile à comprendre, c’est 16 fois "1". et 16 fois "0" dans une valeur de 32 bits, tandis que 4294901760 est magique.

Je trouve cela exaspérant que la famille de langues C ait toujours supporté l'octal et l'hex mais pas le binaire. J'ai longtemps souhaité qu'ils ajoutent un support direct pour le binaire:

int mask = 0b00001111;

Il y a de nombreuses années / emplois, alors que je travaillais sur un projet qui impliquait énormément de maths au niveau des bits, j'en ai eu marre et j'ai généré un fichier d'en-tête contenant des constantes définies pour toutes les valeurs binaires possibles jusqu'à 8 bits:

#define b0        (0x00)
#define b1        (0x01)
#define b00       (0x00)
#define b01       (0x01)
#define b10       (0x02)
#define b11       (0x03)
#define b000      (0x00)
#define b001      (0x01)
...
#define b11111110 (0xFE)
#define b11111111 (0xFF)

Il a parfois rendu certains codes de niveau binaire plus lisibles.

Parfois, la représentation visuelle des valeurs dans HEX rend le code plus lisible ou compréhensible. Par exemple, le masquage ou l'utilisation de bits devient moins évident quand on regarde les représentations décimales des nombres.

Cela peut parfois être dû à la quantité d'espace qu'un type de valeur particulier peut offrir, ce qui peut également jouer un rôle.

Un exemple typique pourrait être un paramètre binaire. Ainsi, au lieu d’utiliser décimal pour afficher certaines valeurs, nous utilisons binaire.

Supposons qu'un objet possède un ensemble non exclusif de propriétés ayant pour valeur on ou off (3 d'entre elles) - une façon de représenter l'état de ces propriétés est de 3 bits.

les représentations valides sont comprises entre 0 et 7 en décimal, mais ce n'est pas si évident. la représentation binaire est plus évidente:

000, 001, 010, 011, 100, 101, 110, 111

De plus, certaines personnes sont très à l'aise avec hex. Notez également que les nombres magiques codés en dur ne sont que cela et qu'il n'est pas si important d'utiliser un système de numérotation quelconque

J'espère que cela aide.

Généralement, utiliser des nombres hexadécimaux au lieu de décimaux, c’est parce que l’ordinateur fonctionne avec des bits (nombres binaires). Lorsque vous travaillez avec des bits, il est plus compréhensible d’utiliser des nombres hexadécimaux, car il est plus facile de passer de hexa à binaire que de Décimal en binaire.

OxFF = 1111 1111 ( F = 1111 )

mais

255 = 1111 1111 

parce que

255 / 2 = 127 (rest 1)
127 / 2 = 63 (rest 1)
63 / 2 = 31 (rest 1)
... etc

Vous voyez ça? Il est beaucoup plus simple de passer de Hex à binaire.

La plus grande utilisation de l'hex est probablement dans la programmation intégrée. Les nombres hexadécimaux sont utilisés pour masquer des bits individuels dans les registres matériels ou pour fractionner plusieurs valeurs numériques regroupées dans un seul registre de 8, 16 ou 32 bits.

Lorsque vous spécifiez des masques individuels, beaucoup de personnes commencent par:

#define bit_0 1
#define bit_1 2
#define bit_2 4
#define bit_3 8
#define bit_4 16
etc...

Au bout d'un moment, ils avancent vers:

#define bit_0 0x01
#define bit_1 0x02
#define bit_2 0x04
#define bit_3 0x08
#define bit_4 0x10
etc...

Ils apprennent ensuite à tricher et laissent le compilateur générer les valeurs dans le cadre de l'optimisation du temps de compilation:

#define bit_0 (1<<0)
#define bit_1 (1<<1)
#define bit_2 (1<<2)
#define bit_3 (1<<3)
#define bit_4 (1<<4)
etc...

Il y a 8 bits dans un octet. Hex, base 16, est laconique. Toute valeur d'octet possible est exprimée à l'aide de deux caractères de la collection 0..9, plus a, b, c, d, e, f.

La base 256 serait plus concise. Chaque octet possible pourrait avoir son propre caractère unique, mais la plupart des langages humains n'utilisent pas 256 caractères. Hex est donc le gagnant.

Pour comprendre l’importance de la tension, considérez que dans les années 70, lorsque vous vouliez examiner votre mégaoctet de mémoire, il était imprimé au format hexadécimal. L'impression utiliserait plusieurs milliers de pages de grand papier. Octal aurait gaspillé encore plus d'arbres.

Pour être plus précis, hex et décimal, sont tous des NOMBRES. Les bases (bases 10, 16, etc.) permettent de présenter ces chiffres de manière plus claire ou plus pratique.

Lorsque vous discutez du nombre de quelque chose qu'il y a " nous utilisons normalement décimal. Lorsque nous examinons des adresses ou des modèles de bits sur des ordinateurs, le format hexadécimal est généralement préféré, car la signification d'octets individuels peut souvent être importante.

Hex, (et octal) ont la propriété d'être des puissances de deux, ils mappent donc bien les groupements de bits. Hex mappe 4 bits en un quartet (0-F), ainsi un octet est stocké dans deux noeuds (00-FF). Octal était populaire sur Digital Equipment (DEC) et d’autres machines plus anciennes, mais un chiffre octal correspond à trois bits, de sorte qu’il ne franchit pas aussi bien les limites d’octets.

Globalement, le choix de la base est un moyen de faciliter votre programmation. Utilisez celui qui correspond le mieux au domaine.

Les nombres hexadécimaux ou hexadécimaux représentent 4 bits de données, entre 0 et 15 ou entre HEX 0 et F. Deux valeurs hexadécimales représentent un octet.

En regardant le fichier, il s’agit d’un code assez fastidieux. J'espère que tu es bon en C et que tu ne l'utilises pas comme tutoriel ...

Hex est utile lorsque vous travaillez directement au niveau du bit ou juste au-dessus. Par exemple, vous travaillez sur un pilote dans lequel vous regardez directement les bits provenant d'un périphérique et qui bidouillons les résultats afin que quelqu'un d'autre puisse lire un résultat cohérent. C’est une représentation compacte du binaire assez facile à lire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top