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 :

Manipulation de bits


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut Manipulation de bits
    Bonjour tout le monde, meilleurs vœux !

    j'ai besoin d'informations concernant les manipulation de bits en Delphi (shl, shr, etc ...) :

    J'ai en fait une variable (un WORD sur 16 bits donc) avec lequel je dois initialiser quelques valeurs, voici ce que j'ai du faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awSlot[0] := (1 shl 11) + 6*60;
    En gros du bit0 au bit10 cela correspond à un temps, et du bit11 au bit13 un délai.

    Ce que je voulais savoir c'est comment lire ou récupérer ses valeurs, est-ce qu'il faut faire comme cela ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for i_cpt := 0 to 16 -1 do
    begin
      if (awSlot[ i_cpt]) and (1 shl 11) <> 0) then
      begin
        showmessage(inttostr((awSlot[ i_cpt]) and (1 shl 11))));
      end;
    end;
    Je ne trouve pas beaucoup d'infos à ce sujet, merci d'avance en tout cas pour vos réponses !

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 743
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 743
    Points : 13 299
    Points
    13 299
    Par défaut
    shl à l'écriture égal shr à la lecture plus un masque.

    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
    const
      TimeMask   = $7FF;
      DelayMask  = $F;
      DelayShift = 11;
     
    var
      Data  :word;
      Time  :word;
      Delay :byte;
     
    begin
      Time  := 6 *60;
      Delay := 1;
     
      //Ecriture
      Data := Time +Delay shl DelayShift;
     
      //Lecture
      Time  := Data and TimeMask;
      Delay := (Data shr DelayShift) and DelayMask;
    end;

  3. #3
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Réponse rapide, correcte et claire merci beaucoup

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    shl à l'écriture égal shr à la lecture plus un masque.

    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
    const
      TimeMask   = $7FF;
      //DelayMask  = $F;
      DelayShift = 11;
    
    var
      Data  :word;
      Time  :word;
      Delay :byte;
    
    begin
      Time  := 6 *60;
      Delay := 1;
    
      //Ecriture
      Data := Time +Delay shl DelayShift;
    
      //Lecture
      Time  := Data and TimeMask;
      Delay := (Data shr DelayShift);// and DelayMask;
    end;
    Si c'est pas critique tu peux utiliser des mod et div.

    Et si ça l'est alors Delaymask ne sert à rien. Le décalage à droite (shr) écrase les données à droite. Ce n'est pas un ror

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 743
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 743
    Points : 13 299
    Points
    13 299
    Par défaut
    Citation Envoyé par sgmsg Voir le message
    Et si ça l'est alors Delaymask ne sert à rien. Le décalage à droite écrase les données à droite. Ce n'est pas un ror
    C'est une question de cohérence. Dès lors que les deux bits de poids fort ne font pas partie de cette donnée, autant les exclure

  6. #6
    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
    Bonsoir,



    Pour ce qui t'intéresse, à savoir : "En gros du bit0 au bit10 cela correspond à un temps, et du bit11 au bit13 un délai", la réponse d'Andnotor est vraiment la meilleure.

    En complément et bon à savoir ça peut etre utile :

    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
    procedure SetBit(var Value: Integer; const Bit: byte); Register;
    asm
      BTS [eax],edx
    end;
     
    Procedure ClearBit(var Value: Integer; const Bit: byte); Register;
    asm
      BTR [eax],edx
    end;
     
    Procedure ToggleBit(var Value: Integer; const Bit: byte); Register;
    asm
      BTC [eax],edx
    end;
     
    function TestBit(const Value: Integer; const Bit: byte): Boolean; register;
    asm
     BT eax,edx
     setb al
    end;
    Bidouilleuse Delphi

  7. #7
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Merci LadyWasky pour le complément,

    en effet la réponse d'Andnotor était bonne, il n'y a aucun soucis ^^

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

Discussions similaires

  1. manipulation de bits d'un byte
    Par orelero dans le forum Langage
    Réponses: 6
    Dernier message: 22/08/2008, 10h41
  2. word_t et Manipulation de bits
    Par fmichael dans le forum C#
    Réponses: 2
    Dernier message: 19/03/2007, 09h33
  3. [VS 2005] Manipuler des bits
    Par b_lob dans le forum C#
    Réponses: 5
    Dernier message: 05/02/2007, 09h51
  4. [Ada] Manipulation de "Bits"
    Par BoBy9 dans le forum Ada
    Réponses: 2
    Dernier message: 14/06/2006, 11h57
  5. Manipulation de bits
    Par Tsly dans le forum C++
    Réponses: 2
    Dernier message: 28/09/2005, 12h41

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