Bonsoir ! Pour les besoins d'un TP à rendre début Décembre je dois programmer un truc en C++ qui puisse convertir une valeur en base 2 entrée par l'utilisateur en Hexadecimal ou inversement.
Je maîtrise bien les deux conversions séparément (avec la base 10 je veux dire), mais ENSEMBLE je ne sais pas comment passer de l'une à l'autre...base 2 et base 16 ou inversement.
Déjà, pourrait-on me l'expliquer clairement ? J'ai fais des recherches mais ça m'a plus embrouillé sur ce que je pensais savoir qu'autre chose
Merci
Note que si tu sais convertir en base 10, tu peux toujours faire la conversion de base 2 a base 10 a base 16. Et inversement. C'est moche, mais en premiere approx c'est pas mal.
Aussi tu peux remarquer qu'un "digit" de base 16 ca corespond a 4 "digit" de base 2. du fait, la conversion se fait sur un groupe comme ca.
Tu analyses le dernier caractère et tu lui attribues une valeur de 0 à 15 selon le caractère, tu multiplie par 16^0. Puis le second pareil pour la valeur mais tu multiplies par 16^1, etc. Ça c'est pour hexa-> décimal si t'en as besoin.
Pour hexa vers binaire c'est super simple, chaque caractère hexa représente 4 caractères binaires ya rien à compter. 0x0 = 0b0000, 0x4 = 0b0100, 0xF = 0b1111, etc. Attention à toujours écrire les 4 caractères ! Fais simplement une table de correspondance
Pour binaire vers hexa c'est l'inverse, et si le nombre total de caractères binaires n'est pas un multiple de 4,rajoute des 0 à gauche pour avoir un multiple de 4.puis 4 par 4 tu fais correspondre binaire vers hexa.
Oui, j'ai pensé à un algo utilisant la base 10 comme intermédiaire, mais je garde ça en plan B ! Ouais j'ai vu cette histoire de 4 digit. Mais mathématiquement parlant je n'arrive pas à me représenter la chose justement, aussi bête que ça puisse être ( et je peux être vraiment bête ). Aurais-tu un exemple ?
Note qu'en ingénierie personne s'amuse à calculer pour faire du binaire vers hexa ou l'inverse. On fait correspondre 4 binaires vers 1 hexa ou l'inverse. C'est en base 10 qu'il faut calculer ^^
Ah ok Tikim ! Merci, je vais essayer ça de suite
Ya pas de maths ici ! C'est un genre de traducteur !
Exemple tu as 0xA5F1, tu prends le À qui donne 10 en décimal, donc 0b1010 (8+0+2+0). Puis le 5 qui vaut... 5 ^^ donc 0b0101 (0+4+0+1).puis F qui vaut 15, donc 0b1111 (8+4+2+1),et finalement 1 qui vaut... 1 ! Donc 0b0001 (0+0+0+1).
Et tu alignes ! Ça fait 0b1010010111110001 (par convention on séparé d'un espace tous les 4 chiffres pour plus facilemebt repasser en hexa).
Pour l'opération inverse si tu as 0b110100001.
Deja ya que 9 digit, il faut un multiple de 4 donc ajouté 3 zéros : 0b000110100001 qu'on va ecrire selon la convention : 0001 1010 0001.
Et la on traduit : 0001 vaut 1, 1010 vaut 10 donc À, 0001 vaut 1 : ça fait 0x1A1.
Voila
Et je mérite une médaille pour avoir tapé ça sur smartphone :/
Par contre, dire qu'il "n'y a pas de maths", c'est un peu rapide, certes une fois qu'on connait ça ce n'est qu'une recette de cuisine, mais il faut tout de même comprendre pourquoi ça marche, et ça se prouve en revenant à la définition de l'écriture en base 2 / 16.
Par exemple pour passer de base 16 à 2 :
n = Somme des k_i . 16^i
= Somme des k_i . 2^4i
= une écriture binaire où les bits 4i à 4(i+1) sont la décomposition du digit k_i
... mais moi je n'ai pas le courage d'écrire ça plus formellement sur jvc
Bien sûr, d'une manière générale si on s'intéresse aux différentes bases il FAUT comprendre le fonctionnement des bases. Mais quand on traite de l'hexa et du binaire, y'a des réflexes à avoir pour pas faire un fromage mathématique. C'est un raccourci que tout le monde prend en informatique.
Je pense que si l'enseignant avait voulu enseigner les bases, il en aurait pris d'autres que 2 et 16. Genre convertit de la base 17 en base 7. Là, perso je passerais par le décimal, mais y'a sûrement plus intelligent.
Le plus simple pour passer de 2 -> 16 c'est de prendre les bits 4 à 4.
Genre tu as
01011011
ca fait 0101 et 1011 tu convertis ca fait :
5B
La conversion de bases est un homomorphisme de monoïdes :D
Les maths trouvent toujours un chemin ;D