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

 Delphi Discussion :

Addition de byte. Comment optimiser ?


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Par défaut Addition de byte. Comment optimiser ?
    Bonjour,

    Je tente de faire une fonction de cryptage (très basique) et je voudrai l'optimiser... Pourriez vous me dire si c'est possible ?

    mon algo est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var
    a_crypter:array[0..99] of byte;
    cle:array[0..99] of byte;
    sortie:array[0..99] of byte;
    begin
     
    for i:=0 to 99 do begin
    if a_crypter[i] + cle[i] > 255 then begin
    sortie[i] := (a_crypter[i] + cle[i]) mod 256;
    end
    else begin
    sortie[i] :=   a_crypter[i] + cle[i] ;
    end;
     
    end;
    y'a pas un moyen plus rapide de faire ça et d'éviter le if ? Je suis bien tenté par traité ce problème avec le binaire (un byte = XXXXXXXX)...

    Vous avez une idée?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Déjà ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if a_crypter[i] + cle[i] > 255 then begin
    sortie[i] := (a_crypter[i] + cle[i]) mod 256;
    end
    else begin
    sortie[i] :=   a_crypter[i] + cle[i] ;
    end;
    c'est la même chose que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sortie[i] := (a_crypter[i] + cle[i]) mod 256;
    donc ça deviens ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i:=0 to 99 do begin
    sortie[i] := (a_crypter[i] + cle[i]) mod 256;
    end;
    pourquoi ? parce que (a + b) mod 256 = a + b si 0 <= (a + b) < 256, a+b - 256k sinon (avec k un entier relatif différent de 0 et a et b positifs, des bytes quoi).

  3. #3
    Membre éclairé Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Par défaut
    Ha oui en effet, ...
    Merci beaucoup
    Y'a t'il moyen de travailler en binaire pour ce genre d'opération ?

    Bonne journée

  4. #4
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    je pense que le mod n'est pas necessaire dans ton cas, car tu stock tes infos dans des bytes.
    du coup, si tu fais
    253 + 5 = 258
    258 mod 256 = 2
    or
    258 = 100000010
    mais un byte ne prend que 8 bits, donc les bits rouges ne seront pas pris en compte, et tu obtiendra donc
    0000010 = 2

  5. #5
    Membre éclairé Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Par défaut
    Merci en effet cela fonctionne bien, je ne sais pas si je gagne en performance, mais en tout cas, la solution me semble plus "belle"...

    Merci Bonne journée

  6. #6
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    Citation Envoyé par remixtech Voir le message
    Y'a t'il moyen de travailler en binaire pour ce genre d'opération ?
    je sais pas si tu peux faire plus optimisé que ca, l'addition se fait simplement en additionnant les bits (donc en binaire). La question qui peut te faire gagner un peu de temps, c'est de savoir si le compilateur fait l'operation sur un entier plus grand qu'un byte (32 octets par exemple) puis ignore les bits au dela des limites du byte, ou si il fait juste le traitement sur les 8 bits necessaires. Mais a mon avis, ca ne change pas grand chose.

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    Euh, les opérateurs logiques et binaires sont les mêmes, ce qui rend parfois la chose confuse par rapport au C ... donc le and var effectuer le masque en recopiant que les 1 en commun ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i:=0 to 99 do 
      sortie[i] := a_crypter[i] and cle[i];
    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

  8. #8
    Membre éclairé Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Par défaut
    Quel est l'avantage d'utiliser le and ? Le '+' n'est il pas un "and" camouflé ici ?

    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CF][C#] Comment optimiser mes requêtes avec SqlCE ?
    Par david71 dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 20/01/2006, 14h48
  2. [Tables][Relations] Comment optimiser ?
    Par liliprog dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 23/12/2005, 02h08
  3. [Perf] Comment optimiser son code ?
    Par Frifron dans le forum Général Java
    Réponses: 12
    Dernier message: 11/08/2005, 09h05
  4. [Performance]Comment optimiser la vitesse ?
    Par le Daoud dans le forum Général Java
    Réponses: 13
    Dernier message: 03/06/2005, 15h47
  5. Comment optimiser une jointure ?
    Par seb_asm dans le forum Administration
    Réponses: 21
    Dernier message: 25/06/2004, 16h42

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