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

Free Pascal Discussion :

Opération binaire sur une variable de type QWord [Free Pascal]


Sujet :

Free Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 160
    Billets dans le blog
    9
    Par défaut Opération binaire sur une variable de type QWord
    Bonjour !

    Je voudrais apprendre la technique des damiers binaires (c'est comme ça que je traduirais bitboard).

    Pour commencer j'ai voulu écrire un petit programme mettant en œuvre l'exemple présenté sur cette page.

    Ça commence mal. Dès le début j'obtiens un résultat inattendu.

    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
    {$mode objfpc}
     
    var
      damier: qword;
      i: integer;
     
    begin
      damier := %0000000000000000000000000000000000000000000000001111111111111111;
     
     
      for i := 0 to 63 do
        if (damier and (1 shl i)) > 0 then
          Write('1')
        else
          Write('0');
    end.
     
    // 1111111111111111000000000000000011111111111111110000000000000000
    Qu'est-ce qui ne va pas dans mon code ? Pourquoi la chaîne affichée ne correspond-elle pas aux chiffres binaires de la valeur en question ?

    D'autres liens intéressants pour la suite de la discussion :
    https://www.chessprogramming.org/Bitboards
    http://pages.cs.wisc.edu/~psilord/bl...ges/index.html

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 160
    Billets dans le blog
    9
    Par défaut
    Dans un programme existant j'ai trouvé cette solution qui donne bien le résultat attendu, mais je me demande toujours pourquoi "ma" solution ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      for i := 0 to 63 do
      begin
        if damier and 1 > 0 then
          Write('1')
        else
          Write('0');
        damier := damier shr 1;
      end;
    Au fait, vous paraît-il plus judicieux d'utiliser un QWord ou un Int64 ? Ou est-ce que ça ne change rien ?

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 120
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 120
    Par défaut
    Salut salut,

    juste sur ça, un petit cadeau (moi aussi j'en avais marre de chercher dans l'aide alors un jour j'ai pris le taureau par les cornes et hop !, copie d'écran de l'aide)
    Citation Envoyé par Roland Chastain Voir le message
    Au fait, vous paraît-il plus judicieux d'utiliser un QWord ou un Int64 ? Ou est-ce que ça ne change rien ?
    Ça doit surement changer quelque chose quand le bit tout à gauche est à 1 ou pas.

    Nom : int_et_real.png
Affichages : 831
Taille : 61,3 Ko

    Allez, que j'ai du graphisme qui m'attend,

  4. #4
    Membre émérite

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Par défaut
    Bonjour,

    C'est la constante 1 qui joue des tours. Elle est integer par défaut donc 1 shl i renvoi un résultat 32 bits signé, ce résultat étant étendu ensuite à 64 bits par adjonction de 32 bits forts pour faire le AND.

    Ceci fonctionne comme attendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      for i := 0 to 63 do
        if (damier and (qword(1) shl i)) > 0 then
          Write('1')
        else
          Write('0');

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 120
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 120
    Par défaut
    Citation Envoyé par DomDA91 Voir le message
    C'est la constante 1 qui joue des tours. Elle est integer par défaut
    Oh lala, ça ne s'invente pas, des trucs pareils !

    Bien joué -- comment tu sais ça, toi ? À force d'avoir pris des gamelles et des râteaux ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 160
    Billets dans le blog
    9
    Par défaut
    @DomDA91

    Oui, cela résout en effet le problème. Comme Jipété, je me suis demandé où vous étiez allé chercher cette solution.

    Je laisse la discussion ouverte, car j'ai l'intention de continuer à creuser le sujet et j'aurai probablement encore besoin d'aide.

    @Jipété

    Merci pour ton soutien.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/03/2011, 08h55
  2. Précision sur une variable de type Number
    Par Proggies dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 29/05/2010, 19h08
  3. Split sur une variable de type TEXT (vs nvarchar)
    Par AliJava dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 20/06/2008, 09h05
  4. ré-initialiser un identity sur une variable de type table
    Par laurent-devel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 31/03/2008, 19h39
  5. Boucle sur une variable de type "heure"
    Par Charles25 dans le forum ASP
    Réponses: 3
    Dernier message: 15/11/2006, 17h51

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