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 Pascal Discussion :

Utilisation des opérateurs 'shr' et 'and'


Sujet :

Langage Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut Utilisation des opérateurs 'shr' et 'and'
    bonjour, on m'a donné le programme (en turbo pascal ) suivant a comprendre mais certaines instructions comprises dedans sont pour moi trop poussées:
    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
     
    function bin (n: byte): string;
    var
    cpt: byte;
    s: string[8];
    begin
    s:=' ';
    for cpt:=0 to 7 do
    begin
    if n and 1=1 then s:=s+'1'
     else s:=s+'1'
    n:=n shr 1;
    end;
    bin:=s;
    end;
    bon je suis vraiment débutant en language turbo pascal , mais par rapport a ce que j'ai cherché il y a quelques intructions "bizarre"
    .pourquoi met-il "shr" ici o lieu de "div" ?
    .quand il fait un ET logique de N avec 1 pouquoi ecrit -il "1=1" et tout simplement "1"?
    voila merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Il faut se pencher sur le côté binaire de la chose. n est un byte, codé sur 8 octets. Si tu compares bit à bit la valeur de n est la valeur de 1 avec un and (ET logique), tu fais en fait un test pour savoir si n est pair ou impair :

    n = xxxxxxxx en binaire (on ne connais pas sa valeur)
    1 = 00000001 en binaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        xxxxxxxx
    AND 00000001
    =   0000000x
    un AND 1 te retourne la valeur du dernier bit de n. Ce dernier bit, si il vaut 0, alors n est pair, si il vaut 1 n est impair.

    Pour le shr, cela signifie "SHift Right", suivi du nombre de rotations, ici 1. Donc tous les bits de n seront décalés de 1 vers la droite, ce qui correspond à une division par 2.

    Après, pour comprendre, il faut avoir un minimum de connaissances en binaire.

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut
    merci pour les infos données..
    mais ce que je ne comprend pas c'est que :
    si on prend un chiffre en binaire au hazard
    11 = 0000 1011 (codé sur 8 bits)
    on fait le "shr" avec ce nombre
    cela reviens a ecrire
    1000 0101 et ce chiffre devient négatif!!

    merci d'avance

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut
    en fait tout simplement ce que je ne comprend pas c'est tout ce qui se passe a partir de la boucle FOR jusqu'au premier end;
    je sais qu'il recopie la valeur de n dans s de 0 jusqu'a 7 mais le reste.....

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut
    Citation Envoyé par cicinho Voir le message
    merci pour les infos données..
    mais ce que je ne comprend pas c'est que :
    si on prend un chiffre en binaire au hazard
    11 = 0000 1011 (codé sur 8 bits)
    on fait le "shr" avec ce nombre
    cela reviens a ecrire
    1000 0101 et ce chiffre devient négatif!!

    merci d'avance
    c'est bon j'ai compris pour le "shr" le dernier bit disparait
    et on met un zéro o bit de poids fort

  6. #6
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Oui les bits qui disparraissent sont remplacés par des 0. Sinon, il faudrait ROR (Rotate Right).

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Par défaut
    salut , merci pour le bout de code ça m'a permis de connaitre de nouvelles fonctions prédéfinies (shr et ror que je vais essayer). par contre je comprends pas cette instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if n and 1=1 then s:=s+'1'
     else s:=s+'1'
    il me semble que dans ce cas la partie else n'a aucun intérêt(même traitement) !
    que veux dire if n cette écriture est elle acceptée avec une variable autre que booléenne ?
    merci

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Kei,
    Citation Envoyé par paskal++ Voir le message
    salut , merci pour le bout de code ça m'a permis de connaitre de nouvelles fonctions prédéfinies (shr et ror que je vais essayer). par contre je comprends pas cette instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if n and 1=1 then s:=s+'1'
     else s:=s+'1'
    il me semble que dans ce cas la partie else n'a aucun intérêt(même traitement) !
    que veux dire if n cette écriture est elle acceptée avec une variable autre que booléenne ?
    merci
    Effectivement, on peut directement écrire
    car faire la même chose dans le then et le else d'un if ... (peut être une erreur de recopie du code ?)

    Sinon, on voit là l'inconvénient de compter sur la priorité des opérateurs pour que le compilateur se débrouille.

    C'est pourquoi je conseille de toujours mettre des parenthèses dans les expressions, pour clarifier la lecture au premier coup d'oeil.

    if n and 1=1 then... avec des parenthèses tenant compte des caractéristiques de Pascal donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (n and 1) = 1 then...
    ce qui est immédiatement compréhensible

  9. #9
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Oui, sauf qu'il s'agit manifestement d'une erreur de recopie du code, puisqu'on a là une fonction servant manifestement à obtenir une chaîne de caractères contenant la représentation binaire d'un entier. Donc il faut corriger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (n and 1) = 1 the s := s + '1' else s := s + '0'

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Hao,
    Citation Envoyé par CapJack Voir le message
    Oui, sauf qu'il s'agit manifestement d'une erreur de recopie du code, puisqu'on a là une fonction servant manifestement à obtenir une chaîne de caractères contenant la représentation binaire d'un entier. Donc il faut corriger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (n and 1) = 1 the s := s + '1' else s := s + '0'
    C'était ce que je laissais entendre.

    ET un jour, il faudra qu'on m'explique pourquoi on se retrouve avec tant de codes mal recopiés.

    Copier/coller existe, il faut être complètement maso pour retaper son code pour le publier sur un forum. D'une part pour le travail inutile que ça représente, et d'autre part, pour les petites erreurs qui sont presque systématiquement ainsi introduites.

  11. #11
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Citation Envoyé par droggo Voir le message
    Hao,

    C'était ce que je laissais entendre.

    ET un jour, il faudra qu'on m'explique pourquoi on se retrouve avec tant de codes mal recopiés.

    Copier/coller existe, il faut être complètement maso pour retaper son code pour le publier sur un forum. D'une part pour le travail inutile que ça représente, et d'autre part, pour les petites erreurs qui sont presque systématiquement ainsi introduites.
    La reponse est qu' il n'existe pas de copier/coller depuis l' editeur de tp vers une fenetre windows. Pour le faire, il faut ouvrir le .pas avec un editeur de texte (bloc-note, pspad,...) pour ensuite faire le copier/coller du code contenu dans l' editeur.Un simple "click droit->ouvrir avec->choisir le programme->bloc-note" sur le fichier conserné permet d' ouvrir le .pas

  12. #12
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    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
    40
     
    // convertis un entier 8bits dans sa representation binaire.
    // exemple $FF ou 255 devient 11111111
    // exemple $00 ou 0    devient 00000000
    // exemple $80 ou 128 devient 10000000
     
    function bin(n: byte): string;
     
     
     
    var
     cpt : byte;        // variable de la boucle For
     s    : string[8];   // chaine temporaire pour le retour
     
     
    begin
     
     
      // initialisation de la chaine temporaire.
      s:=' '; 
     
      // pour cpt de 0 a 7 (8 itérations)
      for cpt:=0 to 7 do
      begin
     
        // si bit 0 de N est égal a 1 alors on ajoute "1" à la fin de S 
        if n and 1=1 then 
           s:=s+'1'
     
        // sinon on ajoute un 0 à la fin de S
        else 
          s:=s+'0';
     
        // on décale les bits de N de 1 vers la droite 
        n := n shr 1;
      end;
     
      // enfin on renvois la chaine temporaire S dans le resultat de fonction
      bin := s;
    end;


    cette fonction, est bonne, mais ont peu faire plus simple (pour byte) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function Bin(const N: byte): string;
    const
      BTC : array[boolean] of char = '10';
    begin
      result := BTC[ (N and $80) = 0 ] +
                BTC[ (N and $40) = 0 ] +
                BTC[ (N and $20) = 0 ] +
                BTC[ (N and $10) = 0 ] +
                BTC[ (N and $08) = 0 ] +
                BTC[ (N and $04) = 0 ] +
                BTC[ (N and $02) = 0 ] +
                BTC[ (N and $01) = 0 ];
    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!

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (n and 1) = 1 then s := s + '1' else s := s + '0'
    du coup je comprends mieux l'explication de wormful sickfoot.
    je vais essayer d'implémenter le code pour voir ce que ça donne.
    bravo messieurs et merci beaucoup

  14. #14
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut autre aide au turbo pascal
    merci pour vos différentes réponses,
    par rapport au copier coller, c'est que l'on m'a fournit le programme sur feuille papier.

    dans la suite de mon programme...
    je me retrouve avec cette instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s:= '0' + copy(s,1,127);
    je voudrais juste savoir si le zéro entre parenthèse signifiait la valeur du zéro en ASCII ou non car si ce n'est pas le cas je ne comprend pas cette ligne de code.

    merci d'avance.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/12/2009, 14h34
  2. Réponses: 3
    Dernier message: 02/07/2007, 17h32
  3. [SQL] Utilisation des opérateurs SQL plutôt que PHP
    Par php_newbie dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/05/2006, 11h38

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