J'ai une fonction c pour convertir décimale en une chaîne hexagonale avec code du pilote: p> Ma sortie est la suivante:
Chaque sortie a la dernière valeur correcte, mais toutes les valeurs avant que le dernier ne soit pas évaluée. Je crois que c'est parce que mon heexconversion code>:
00000002 0000000F 0000000F 0000000F 00000000F 0000000F 00000000F 000000F 000000F 00000000F 00000000F 000000F 0000000F CODE> P>
temp = masque et num code> ne produit pas une valeur qui n'est pas 0-15. Ma question est de savoir comment ne considère que 4 bits à la fois pour que toutes mes valeurs code> Temp code> seront dans cette plage? P> p>
3 Réponses :
Cela dépend de votre système, mais si vous souhaitez extraire NYBBLES de votre valeur.
Vous pouvez éventuellement appliquer 0xf (masques >> (4 * N) sur vos valeurs
Par exemple
Si j'ai eu une donnée binaire ressemblant à ce Pour obtenir la nième partie de cette valeur, vous pouvez dériver le (0xf000) avec le >> 4 N fois p> 0x4602 = 0100 0110 0000 0010 code>
et je dois extraire seulement la 1ème partie de celui-ci
Je pourrais utiliser un
0xf000 = 1111 0000 0000 0000 code> avec un et masque sur cette 0x4602
Pour obtenir la première partie de cette valeur
Cela nous donnerait
0xf000 = 1111 0000 0000 0000 0000
& 0x4602 = 0100 0110 0000 0010
Le résultat serait 0x4000 = 0100 0000 0000 0000 code> p>
Vous devez exécuter une boucle de 0 à 7 et déplacer également le nombre après avoir appliqué le masque sur la nibble inférieure.
La première remarque en regardant votre code sans envisager le problème, c'est pourquoi gérez-vous bien le cas 0..9 mais vous séparez le cas A et B ... et F plutôt que de faire la même chose que vous le faites pour le chiffre?
SO P>
void hexConversion(int num){ char hex_buffer[sizeof(int)*2 + 1]; for(size_t i = 0; i < sizeof(int)*2; i++){ int temp = (num >> (sizeof(int)*8-4-4*i)) & 0xf; if(temp < 10){ hex_buffer[i] = temp + '0'; } else { hex_buffer[i] = temp - 10 + 'A'; } } hex_buffer[sizeof(int)*2] = 0; puts(hex_buffer); }
Vous devriez changer
num code> plutôt que
masque code>. Et
masque code> doit masquer le nibble inférieur. Notez que vous feriez mieux d'utiliser des types non signés.
La chose la plus facile est probablement de générer la chaîne de droite à gauche. Examiner
num & 0x0f code> et shifter num
Il n'y a pas de décimale impliquée ici. Vous encodez une valeur binaire en tant que chaîne hexagonale. Pour une décimale de sens, vous devriez convertir une chaîne décimale ou utiliser un ordinateur qui représente des chiffres en interne comme décimal.
Notez que la boucle écrira sur
hex_buffer [8] code> qui sera remplacée ultérieurement par
heex_buffer [8] = '\ 0'; code>
@Weathervane L'erreur n'est bien sûr pas à faire
hex_buffer [8] = '\ 0' code> mais pour activer 9 fois (parmi plusieurs autres erreurs)
J'ai mis une proposition pour répondre à votre question si vous êtes intéressé ;-)