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

Langage Delphi Discussion :

decomposition binaire


Sujet :

Langage Delphi

  1. #21
    Expert éminent
    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
    Points : 8 344
    Points
    8 344
    Par défaut
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     procedure setBit(var val : Integer;pos : Integer;
                      BitVal : Boolean);
     var
      ActualVal : Boolean;
      tmpVal,i : Integer;
     begin
     
      tmpVal := val;
      ActualVal := getBit(val,pos);
      if(ActualVal <> BitVal) then
       begin
        val := val shr pos;
     
        if(ActualVal = True) then
         val := val -1
        else
         val := val +1;
     
        for i := 1 to pos do
         begin
          val := val shl 1;
          if(getBit(tmpVal,pos-i)) then
           val := val +1;
         end;
       end;
     end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i : Integer;
    begin
     i := 0;
     setBit(i,0,True);
     setBit(i,1,True);
     setBit(i,2,True);
     setBit(i,3,False);
     setBit(i,4,True);
     ....
    voilà, ce n'est pas vraiment optimisé mais on a bien
    10111

    [Edit]folie quand tu nous tient, extra optimisé
    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
     
     procedure setBit(var val : Integer;pos : Integer;
                      BitVal : Boolean);
     var
      ActualVal : Boolean;
     begin
      ActualVal := getBit(val,pos);
      if(ActualVal <> BitVal) then
       begin
        if(ActualVal) then
         val := val - (1 shl pos)
        else
         val := val + (1 shl pos);
       end;
     end;

  2. #22
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    Merci smyley ca marche Nickel

    Cordialement Henri

  3. #23
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Puisqu'il semble qu'il faut être un peu fou sur ce topic...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure setBit(var val : Integer;pos : Integer; 
                      BitVal : Boolean); 
     begin 
      If BitVal
        Then Val := Val Or (1 Shl Pos)
        Else Val := Val And (Not(1 Shl Pos));
     end;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  4. #24
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    dédicacé à tourlourou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure setBit(var val : Integer;pos : Integer;BitVal : Boolean);Register;
    asm
      BTR [EAX],EDX
      TEST ECX,ECX
      JZ @Fin
      BTS [EAX],EDX
    @Fin:
    end;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  5. #25
    Expert éminent
    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
    Points : 8 344
    Points
    8 344
    Par défaut
    dit tu pourrais m'expliquer ce que fait ton code au juste ? ( j'ai jamais vraiment pigé l'asm )
    EAX est égal à quoi au début ?
    BTR et BTS font quoi ?
    TEST au moin j'ai compris qu'on vérifie si EAX != NULL
    ...

  6. #26
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Avec la directive register les arguments sont dans EAX, EDX puis ECX.
    Ici Val est passé par variable, donc dans EAX c'est l'adresse de Val et non val lui-même.
    EDX contient le deuxième argument. Ici POS
    ECX contient le troicième paramètre, ici bitval

    BTR met le teste le Nème bit puis le met à zéro. On ne se sert pas du test ici, mais juste de la mise à zéro.

    BTS fait de même en le mettant à 1.

    On le met donc à 0 par défaut puis on le met à 1 en fonction du test.

    Si tu veux plus de détails sur l'asm dans Delphi c'est ici :
    http://nono40.developpez.com/tutoriel/delphi/asm
    Pour le détail des fonctions c'est ici :
    http://intel.com
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  7. #27
    Expert éminent
    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
    Points : 8 344
    Points
    8 344
    Par défaut
    ok je voie,
    pour cette lumière
    faudrait que j'éssai de m'y mettre, au moin pour le fun

  8. #28
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 84
    Points : 58
    Points
    58
    Par défaut whaou !!!
    whaou !! toutes ces reponses + compliquées les une ke les autres .... !!!

    merci a tous ... bon a present fo ke je lise tout ca ... ;-)

    encore merci !

  9. #29
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Allez, je vous livre mes versions
    Sachant que le bit le plus faible est le n°0

    c'est une dédicace pour tourlourou
    c'est aussi une dédicace pour Nono40 (y'a pas de vilain label dans mon assembleur)

    Teste si un bit est égal à 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function TestBit(const Value: Integer; const Bit: byte): Boolean;
    asm
     mov ecx,edx
     mov edx,$00000001
     shl edx,cl
     test edx,eax
     setnz al
    end;
    "Allume" un bit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function SetBit(const Value: Integer; const Bit: byte): Integer;
    asm
      mov ecx,edx
      mov edx,$00000001
      shl edx,cl
      or eax,edx
    end;
    "Eteint" un bit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function ClearBit(const Value: Integer; const Bit: byte): Integer;
    asm
      mov ecx,edx
      mov edx,$00000001
      shl edx,cl
      not edx
      and eax,edx
    end;
    Inverse un bit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function ToggleBit(const Value: Integer; const Bit: byte): Integer;
    asm
      mov ecx,edx
      mov edx,$00000001
      shl edx,cl
      xor eax,edx
    end;
    ça y'est, j'ai aussi explosé un neurone !
    Bidouilleuse Delphi

  10. #30
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Setbit, ClearBit, et togglebit tu peux le faire en une seule ligne ASM Je te laisse chercher un peu.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  11. #31
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    PETIT RESUME , après tout ca

    Réponse à la question initiale, je vois 2 codes + rapide et + compact sans assembleur.

    Mon code était rapide mais tournait 32 fois (pour un entier), quelque soit le nombre à tester.
    Celui de Nono (rectifié) est je pense au moins aussi rapide, et s'arrete de tourner dès qu'il n'y a plus de bit activé (donc nettement + rapide pour de petits nombres)

    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
    // renvoie N° de bits activé, en commencant par 1
    // Variante, code initial Nono
    function BinExoNono(valeur:longword):string;
    var
    	IPos : Integer;
    Begin
      Result:='';
      IPos := 1;
      Repeat
        if Valeur and 1 <> 0
          then Result := Result + IntToStr( IPos ) + ';'; 
        Valeur := Valeur shr 1;
        Inc( IPos );
      Until Valeur=0;
    End;
    et pour la conversion Nombre->chaine binaire, celui de nono
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Affiche un entier sous forme binaire
    function hexatobin(valeur:longword):string;
    Begin
      Result:='';
      Repeat
        Result:=Chr(48+Ord(Odd(Valeur)))+Result;
        Valeur := Valeur shr 1;
      Until Valeur=0;
    End;
    Ce post finira-t-il un jours ?
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  12. #32
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Nono40
    Setbit, ClearBit, et togglebit tu peux le faire en une seule ligne ASM Je te laisse chercher un peu.
    Là, tu me cherches (si, si ), tu veux que je "claque" mon dernier neurone ? Je le vois dans ton regard...
    Bon, n'y aurait-il pas du register et du BTR, du BTS et du BTC dans l'air par hazard ?

    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure SetBit(var Value: Integer; const Bit: byte); Register;
    asm
      BTS [eax],edx
    end;

    "Eteint" un bit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Procedure ClearBit(var Value: Integer; const Bit: byte); Register;
    asm
      BTR [eax],edx
    end;

    Inverse un bit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Procedure ToggleBit(var Value: Integer; const Bit: byte); Register;
    asm
      BTC [eax],edx
    end;
    Trop fastoche
    Bidouilleuse Delphi

  13. #33
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Bonus !!!

    Une amélioration de TestBit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function TestBit(const Value: Integer; const Bit: byte): Boolean; register;
    asm
     BT eax,edx
     setb al
    end;
    ça c'est de l'optimisation
    Bidouilleuse Delphi

  14. #34
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 84
    Points : 58
    Points
    58
    Par défaut pour info
    Tout d'abord, un grand a tout le monde pour les nombreuses reponses.

    et pour info :
    j'ai juste utilise des et logiques :

    du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (iCodeBinReference and  iCodeBinATester = iCodeBinReference ) then
    begin
    ...
    end;
    avec iCodeBinReference et iCodeBinATester : integer

    ca marche tres bien.

    encore merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/12/2002, 12h31
  2. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19
  3. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

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