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 :

Travailler au niveau du bit


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 98
    Par défaut Travailler au niveau du bit
    Bonjour à tous.
    Comment faire dans delphi pour intervenir au niveau du bit ?
    Par exemple :
    J'ai un octet A et je veux mettre à jour son bit n°3 à l'aide d'un octet B qui peut prendre la valeur 0 ou 1. Bien sûr les bits 0 à 2 et 4 à 7 de A ne doivent absolument pas être affectés par l'opération.

    Merci d'avance,

    Robert

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if b>0
     then a:=a or 8  
     else a:=a and (255-8);
    à vérifier...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    tu peux faire un masque....
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      si  A = 00001101
      et B = 11110111
      et la tu fais: A and B
      et si C est le résultat de l'opération tu as: C=00000101
    Tu as fais passé le bit 3 à 0



  4. #4
    Membre émérite
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Par défaut
    bon pour commencer une petit routine bien pratique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function BinToInt(valeur : String) : Integer;
    // convertit une valeur binaire en sa représentation entière
    var
      i : Integer;
    begin
      Result:=0;
      for i:=Length(valeur) downto 1 do
        if (valeur[i] = '1') then
          Result:=Result + Round(Power(2, Length(valeur) - i));
    end;
    à priori il faut commencer par mettre tous les bits autres que 3 à 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C := B or BinToInt(00000100);
    ensuite tu combines le résultat avec ta variable A :

  5. #5
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    je ferais comme Tourlourou
    (si j'ai bien compris, B vaut est la valeur de bit qu'il faut affecter au bit de rang N de A...)
    mais j'ai l'impression que tout le monde n'a pas compris la même chose, et l'autre version c'est combiner avec le meme bit respectif de B...
    je m'en tiens à ce que j'ai cru comprendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NoRang := 3;
    if B = 0
      then A := A and ( High( [Type de A] ) - ( 1 shl NoRang )  )
      else A := A or ( 1 shl NoRang );
    Attention au bit de signe !
    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 ;-)

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    joli et général !
    là, tu alignes les 3 croix, TicTacToe...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre éclairé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Par défaut
    Bonjour
    Citation Envoyé par tourlourou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if b>0
    then a:=a or 8  
    else a:=a and (255-8);
    Sauf que la valeur 8 représente le bit de poids 4 et non 3...
    Car si 2^3=8, il ne faut pas oublier que 2^0=1
    Je dirais donc plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if b>0
    then a:=a or 4  
    else a:=a and (255-4);
    Sauf erreur... car on est le soir, donc après une journée de dur labeur

    Bon, sans rancune, c'était juste pour le fun

  8. #8
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    heu... je voudrais pas me méler, mais je crois que malgré sa dure journée (je sais pas ),

    Etant donné que dans l'énoncé de départ, il est bien décrit que les bit vont de 0 à 7, le n°3 correspond bien comme tu le cites OutOfRange
    à
    2^3 = 8 et non 3 comme tu dis dans ton code. (qui correspond au bit N°2).

    1 = 0000 0001 -> bit N°0
    2 = 0000 0010 -> bit N°1
    4 = 0000 0100 -> bit N°2
    8 = 0000 1000 -> bit N°3
    16 = 0001 0000 -> bit N°4
    etc...
    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 ;-)

  9. #9
    Membre éclairé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Par défaut
    Oups
    Mea culpa
    La journée aurait été encore + dure que je ne le pensais
    Je vais devoir m'astreindre à relire 1024 fois les posts avant de me ridiculiser à nouveau...
    Bonne prog

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 98
    Par défaut
    Merci à tous,
    et désolé de ne pas avoir répondu + tôt. J'avais oublié d'activer la notification et je croyais n'avoir aucune réponse.

    Cordialement,

    Robert

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

Discussions similaires

  1. Travailler avec un entier 64 bits et double (64 bits aussi)
    Par bubulemaster dans le forum Langage
    Réponses: 2
    Dernier message: 22/09/2008, 18h56
  2. Comment travailler avec des bits ?
    Par supergrey dans le forum C++
    Réponses: 14
    Dernier message: 27/02/2008, 16h58
  3. comment restaurer les bits du registre ISR au niveau du PIC
    Par amaradelll dans le forum Composants
    Réponses: 1
    Dernier message: 23/02/2007, 18h33
  4. image en niveau de gris 16 bits
    Par kekeauboulot dans le forum Delphi
    Réponses: 2
    Dernier message: 16/06/2006, 19h25
  5. Travailler avec des bits
    Par Vulvulune dans le forum Langage
    Réponses: 5
    Dernier message: 02/03/2003, 19h09

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