-2
votes

Compte tenu de seulement 4 bits à la fois lors de la conversion décimale en hexagone

J'ai une fonction c pour convertir décimale en une chaîne hexagonale heexconversion : xxx

avec code du pilote: xxx

Ma sortie est la suivante: 00000002 0000000F 0000000F 0000000F 00000000F 0000000F 00000000F 000000F 000000F 00000000F 00000000F 000000F 0000000F

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 temp = masque et num 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 Temp seront dans cette plage?


6 commentaires

Vous devriez changer num plutôt que masque . Et masque 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 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] qui sera remplacée ultérieurement par heex_buffer [8] = '\ 0';


@Weathervane L'erreur n'est bien sûr pas à faire hex_buffer [8] = '\ 0' mais pour activer 9 fois (parmi plusieurs autres erreurs)


J'ai mis une proposition pour répondre à votre question si vous êtes intéressé ;-)


3 Réponses :


2
votes

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 0x4602 = 0100 0110 0000 0010 et je dois extraire seulement la 1ème partie de celui-ci Je pourrais utiliser un 0xf000 = 1111 0000 0000 0000 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

Pour obtenir la nième partie de cette valeur, vous pouvez dériver le (0xf000) avec le >> 4 N fois


0 commentaires

1
votes

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. xxx


0 commentaires

2
votes

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);
}


0 commentaires