IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Delphi Discussion :

convertir Char A..Z,a..z vers Byte 1..26 en une instruction


Sujet :

Contribuez Delphi

  1. #1
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut convertir Char A..Z,a..z vers Byte 1..26 en une instruction
    ord ?

    upcase ?

    pointer byte sur char puis décrémenter de $40 ou $60 sur condition complexe ?


    non rien de tout ça, oubliez les trucs alambiqué et peu performant.

    les deux méthodes les plus rependues et utilisées prennent au moins 4 à 6 instruction (deux soustraction, une comparaison et un saut conditionnel).

    voici la méthode à une seule instruction (version pascal et asm) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function asm_OrdAZaz(const C: AnsiChar): byte;
    asm
      and al, $1F;
    end;
     
    function OrdAZaz(const C: AnsiChar): byte; // peu etre Inline pour eviter le call!
    begin
      result := byte(C) and $1F;
    end;
    ce qui donne :
    A = a = 1
    B = b = 2
    C = c = 3

    notez qu'il est injustifié d'utiliser la méthode en assembleur puisque la méthode pascal généré par le compilateur sera identique à cette dernière, de plus on pourra utiliser la directive INLINE (D2007+) qui permettra de se passer du CALL sur OrdAZaz

    on peu faire pareil pour les chiffre de 0 à 9 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result := byte(Chiffre) and $0F;
    '0' = 0
    '1' = 1
    '2' = 2


    voila et bon code.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Ord() et Byte() ça fait la même chose en D6 ... Ord() n'est pas une vraie fonction, c'est une macro* du compilateur

    Et l'avantage, c'est que Ord cela fonctionne en D2009 ! alors que le transtypage en Byte, c'est juste le truc à ne plus faire !

    Mais effectivement, l'astuce du 1F parce que les mecs qui ont pondus l'ASCII ont été suffisamemt malin pour écarté 'A' et 'a' de 32 n'est pas un hazard ... et ce n'est pas un hazard non plus qu'ils ont choisi de mettre 'A' et 'a' comme multiple de 32 + 1 car oh 32 = 20 h = 1F h + 1, je crois que c'est l'une des premières astuces à la con que j'ai appris au cours assembleur à l'IUT ... pour ne pas gérer la casse à l'interruption 21h fonction 6

    * j'ignore si c'est le terme adéquat !

    Moi aussi, j'aime bien écrire ce genre de code à la con, je vois qu'avec le passage en UniCode, j'ai juste envie de me dire qu'il vaut mieux faire une fonction robuste avant tout que le truc bidouillé pour gagner quelques micro-cycles ... pourtant c'est tellement plus drôle !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. String vers byte[]
    Par EpOnYmE187 dans le forum Langage
    Réponses: 8
    Dernier message: 28/10/2011, 11h23
  2. Convertir char vers QString
    Par darkwall_37 dans le forum Débuter
    Réponses: 3
    Dernier message: 25/05/2009, 11h49
  3. Conversion String vers Byte
    Par zulianithomas dans le forum Delphi
    Réponses: 8
    Dernier message: 07/10/2006, 10h09
  4. Comparer 2 Char / Convertir Char -> Int
    Par mbk-w dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/06/2006, 11h09
  5. Conversion String en Hexa ("1F") vers byte
    Par ducseb dans le forum Langage
    Réponses: 1
    Dernier message: 15/04/2006, 20h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo