CONVERSIONS : BINAIRE - OCTALE - DECIMALE - HEXADECIMALE

cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 - 2 nov. 2002 à 13:32
cs_sasah Messages postés 1 Date d'inscription samedi 2 août 2008 Statut Membre Dernière intervention 6 août 2008 - 6 août 2008 à 11:55
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/12201-conversions-binaire-octale-decimale-hexadecimale

cs_sasah Messages postés 1 Date d'inscription samedi 2 août 2008 Statut Membre Dernière intervention 6 août 2008
6 août 2008 à 11:55
salut! il y a presque tout là mais porrais-tu me donner le code source de la conversion binaire-hexa, j'ai essayé de combiner les fonctions bindeci et decihexa plusieurs fois mais ça n'a pas marché.
Merci!
cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
2 nov. 2002 à 19:27
Le Ord(BinVal[i])-Ord('0') est pour obtenir la valeur de 0 à 9 à partir des caractères ascii '0' à '9'. Comme tu as mis dans ton source la code ascii de '0' est 48 et celui de '9' est 57, on aurai pu écrire Ord(BinVal[i])-48. Mais ceci implique de connaitre la valeur 48. En plaçant Ord('0') le résultat est le même mais il n'y a pas besoin de connaitre la valeur Ascii de '0'.

Pour les virgules, tout dépend du format utilisé pour le stockage. L'un des format connu est le IEEE754 : ( format Single de Delphi )
http://www.blois.univ-tours.fr/~marcel/archi/node53.html
http://lojiax.free.fr/systeme/cours.htm

Nono.
hvb Messages postés 939 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 27 janvier 2009 3
2 nov. 2002 à 14:22
merci tout d'abord à toi d'avoir pris le temps de checker ma source (c'est pratique pour un debutant).
Je pense voir a peu près mes erreurs grace à ton commentaire, (apres un petit temps de reflexion tout de meme ^^ ) .
Tout d'abord je comprends pkoi commencer par le bit de poid fort et non de poid faible, cela m'evitera de checker si c'est le bit le plus faible a chaque fois... ce qui entrainera donc aussi la suppression du case inutile.
Malgré tout ca, il va falloir que je relise plusieurs fois ta ligne "for i := 1 to Length(binval) do Result:=Result*2+Ord(BinVal[i])-Ord('0');" , je ne comprends pas la soustraction du Ord('0') ...
bref je vais de toute facon essayer de tout refaire pour gerer les virgules.
Merci à toi. :)
cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
2 nov. 2002 à 13:32
Si tes conversions de base 10 à autres sont simples, tes conversions de autres à base 10 sont bien compliquées : utiliser des variants et des exp() juste pour des conversions...
En fait comme tu commence par le poids faible des nombre alors qu'il faut commencer par le poids fort. Ainsi à chaque chiffre l'opération est la même :
Result:=Result*Base+Valeur(ChiffreSuivant);

Voici ce que ça donne pour la base 2 :
function bindeci(binval : string) : integer;
var i : integer;
begin
result:=0;
for i := 1 to Length(binval) do Result:=Result*2+Ord(BinVal[i])-Ord('0');
end;

Et vu que pour toutes les bases le calcul est le même, il est préférable de ne faire qu'une seule procédure : ( elle fonctionne pour les bases 2 à 36 )
function basedeci(binval : string;Base:Integer) : integer;
var i : integer;
begin
result:=0;
for i := 1 to Length(binval) do
Case BinVal[i] Of
'0'..'9':Result:=Result*base+Ord(BinVal[i])-Ord('0');
'A'..'Z':Result:=Result*base+Ord(BinVal[i])-Ord('A')+10;
End;
end;

Dans DeciHexa tu met deux fois le case ... Of, une seule fois suffit si turemplace
while n >= 16 do par while n<>0 do ( comme tu as fait pour la base 2 )

Pense aussi à utiliser Result plutôt qu'une variable intermédiaire, ne recopie pas non plus les paramètres dans des variables locales : c'est moins lisible et parfaitement inutile pour la vitesse.

Nono.
Rejoignez-nous