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

Codes sources à télécharger Delphi Discussion :

Comment déterminer la parité d'un nombre


Sujet :

Codes sources à télécharger Delphi

  1. #1
    Membre chevronné
    Avatar de DelphiCool
    Homme Profil pro
    Ingénieur de production
    Inscrit en
    Mars 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur de production
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 187
    Points : 2 198
    Points
    2 198
    Par défaut Comment déterminer la parité d'un nombre
    Bonjour,

    Je vous propose un nouvel élément à utiliser : Comment déterminer la parité d'un nombre

    Comment déterminer la parité d'un nombre.

    Qu'en pensez-vous ?
    Hiacine

    Quand on veut, on peut...

  2. #2
    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
    pour des entiers il est plus simple et performant de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function estPair(a: integer): boolean;
    begin
      result := (a and 1) = 0;
    end;
    car en binaire seul le premier bit est égal à 1 donc impair, donc si ce bit est à zéro, le chiffre est paire.
    tout cela se passe par un masque ET sur bit 0x01

    Ta méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function EstPair(const VotreChiffre :integer):boolean;
     var i :integer;
      begin
       result := false;
     
       i := VotreChiffre div 2;
     
       if i * 2 = VotreChiffre Then result := True;
      end;
    génère l'assembleur suivant :

    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    xor ecx,ecx
    mov edx,eax
    sar edx,1 
    jns lp0
    adc edx,$00
    lp0:
    add edx,edx
    cmp eax,edx
    jnz lp1
    mov cl,$01
    lp1:

    soit 9 instruction, deux conditions jump, une addition, une comparaison, un ou exclusif, un décalage de bit .... tout ça pour ... savoir si N est pair ou impair.

    même en optimisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function EstPair(const VotreChiffre :integer):boolean;
    begin
      result := ((VotreChiffre div 2) * 2) = VotreChiffre;
    end;
    on génère en assembleur :

    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mov edx,eax
    sar edx,1
    jns lp0;
    adc edx,$00
    lp0: add edx,edx
    cmp eax,edx
    setz al

    -2 instructions... pourtant on a supprimer pas mal de trucs.

    Donc non, la méthode est "à connaitre" mais à ne pas mettre en production.

    voici l'assembleur généré par le "ET 1" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result := (votreChiffre and 1) = 0;
    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test al,$01
    setz al

    deux instructions.
    [ 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!

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Et avec if not odd(MonEntier) then MonEntierEstPair n'est ce pas kif-kif ?

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    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
    génére sur D2009 ceci :

    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    and al,$01
    xor al,$01

    mais (N and 1) xor 1 n'est pas une expression booléenne !
    pour la rendre booléenne il faudrait l'ecrire :

    boolean((N and 1) xor 1)

    Ce qui oblige a faire un transtypage, qui ne change rien à l'assembleur généré, certes, mais qui fait de l'écriture en plus pour le développeur.

    par contre je crois que sur les anciennes version de delphi Odd etait une fonction donc risque de donner 4 instruction voir 5 au lieu de 2.

    autre avantage, c'est que Odd n'est pas forcement dispo sur tout les langages (php, javascript par exemple), la solution AND= fonctionne donc sur tous :

    php : ($N & 1 == 0)
    javascript/c/perl : (N & 1 == 0)
    python : (N and 1 == 0)
    delphi : ((N and 1) = 0)
    asm : test al,$1; setz al;

    facile à retenir et à implémenter.

    la solution du XOR peut par contre être pratique pour faire de la condition un sélecteur d'index dans un tableau ou liste. puisque le resultat par défaut est un entier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    const
      ABool : array[boolean] of TColor = ( clWhite, clBlack );
      AInt : array[0..3] of TColor = (clRed, clBlue, clGreen, clYellow);
    begin
      Color1 := ABool[ (N and 1) = 0];
      Color2 := AInt[ I + (N and 1 xor 1) ];
    end;
    [ 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!

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    A Dr Who :
    Odd fonction [de Delphi1 et au moins jussqu'à D5] ... risque de donner 4 instructions voir 5 au lieu de 2.


    Ok, merci, ... mais qu'est-ce-que c'est bien compliqué quand on n'y pige rien en Asm.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    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
    Oh non, je disais ça aussi au départ, mais en fait c'est trés trés simple.

    faut juste s'y mettre un peu.

    Du moins tant qu'on comprend que, plus il y a d'instructions plus ça mets du temps et donc, moins il y en as, moins ça mets de temps, c'est déjà ça.

    par exemple, si tu fait inc(I), tu obtient une seule instructions.

    Et les instructions de ce type, sur un registre 32bit, tu peux considérer que tu peux en 1 seconde en faire autant que de Ghz du CPU (à quelques milliers prés).

    en gros, CPU 1.8Ghz -> 1 seconde = 1 800 millions d'incrémentations possible (théorique), CPU 3Ghz -> 1 seconde = 3 milliard d'incrémentations possible.

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var I : LongWord;
    for N := 0 to GetCpuFrequency-1 do
      inc(I);
    théoriquement, il faut 1 seconde pour exécuter cette boucle hors instructions nécessaires à la boucle (1 seconde également).
    soit à peu prés entre 1 et 3 secondes maximum.

    Les opérations sur les flottant (hors type Single) sont quasiment le double ou quadruple de temps.
    Single est trés rapide car 32bits, ce n'est pas pour rien qu'il est préféré à Double dans la GDI+, OpenGL et DirectX.
    [ 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!

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    A Dr Who :
    Du moins tant qu'on comprend que, plus il y a d'instructions plus ça mets du temps et donc, moins il y en as, moins ça met de temps, c'est déjà ça
    .
    OK, ça c'est clair comme de l'eau de roche.

    Single est trés rapide car 32bits, ce n'est pas pour rien qu'il est préféré à Double dans la GDI+, OpenGL et DirectX.
    C'est bon à savoir, car on hésite souvent lors du choix entre les divers types de Flottants.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #8
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    @Gilbert

    Dans le même ordre d'idée, un pf32bit s'affiche plus de deux fois plus vite qu'un pf24bit sur un système 32 bits.
    Pour toi qui fait fort dans le graphisme en ce moment, c'est bon à savoir.

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    A Caribensila :
    Dans le même ordre d'idée, un pf32bit s'affiche plus de deux fois plus vite qu'un pf24bit sur un système 32 bits.
    Pour toi qui fait fort dans le graphisme en ce moment, c'est bon à savoir.
    Super, merci pour l'info ça me permettra de faire un nettoyage dans mes units
    (J'utilise Delphi-5, 32 bits sous Windows 64bits).

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 162
    Points : 124
    Points
    124
    Par défaut
    Merci Dr.Who, on s'améliore tous les jours grâce à des gens comme vous !

  11. #11
    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
    cari à parfaitement raison, un bitmap 32bits se gère deux fois plus rapidement qu'un bitmap 24 bits.

    car 1 pixel = 1 registre = 4 octet = base d'allocation mémoire.

    Si j'alloue la mémoire de 4 en 4 (ou de 2 en 2) je tomberai pile sur la taille d'une page de mémoire.

    bitmap 1024*768*32bits = 768 pages
    bitmap 1920*1080*32bits = 2025 pages
    parcours des pixels avec les registres types EAX, EDX, ECX

    bitmap 1024*768*24bits = 576 pages <- ça vas encore
    bitmap 1920*1080*24bits = 1518.75 pages ! <- et voila le caca.
    parcours des pixels avec les registres type ESI/EDI

    Attention, avec PNG, PNG24 n'est pas purement 24Bit ! C'est un bitmap 32bit dont le 4eme octet est utilisé pour l'alpha.
    donc PNG24 = BMP32.

    est inutile de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Bitmap.Assign(PNG);
    Bitmap.PixelFormat := pf32bit; // <- inutile
    Par contre, JPEG est 24bit et = BMP24.

    Donc est nécessaire de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JPG.DibNeeded;
    Bitmap.Assign(JPG);
    Bitmap.PixelFormat := pf32bit;
    [ 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!

Discussions similaires

  1. Comment déterminer le nombre de jours d'un mois ?
    Par BAMBADJI dans le forum Général Java
    Réponses: 11
    Dernier message: 04/02/2015, 01h27
  2. Réponses: 7
    Dernier message: 04/06/2008, 14h53
  3. Réponses: 5
    Dernier message: 24/04/2007, 11h17
  4. Comment déterminer si un .class est un nombre ?
    Par kisame dans le forum Langage
    Réponses: 9
    Dernier message: 10/04/2006, 14h14
  5. Comment déterminer si un composant est d'un type "TMonT
    Par DanielR dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/03/2004, 18h22

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