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

C Discussion :

programme en c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Par défaut programme en c
    Bonsoir a tous ,

    as que il y quelqu'un parmi vous qui peut m'explique ce code la (explication de la fonction Deplace) ?

    merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int Deplace(int a,int b,int d)
    {
    	int i;
    	int mask=0x0001;// 0x sert a dire dans quelle base on ecrit 
     
    	for(i=0;i<d;i++,mask<<=1) if(!(a&mask)&&(b&mask)) return(d-i);
     
    	// a&mask permet de tester le bit de poids faible de a.
    	return 0;
    }

  2. #2
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonsoir,

    La variable locale mask va évoluer d fois binairement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Exemple image binaire de mask pour d = 5 :
        0000 0000 0000 0001 = 0x0001 (d=0)
        0000 0000 0000 0010 = 0x0002 (d=1)
        0000 0000 0000 0100 = 0x0004 (d=2)
        0000 0000 0000 1000 = 0x0008 (d=3)
        0000 0000 0001 0000 = 0x0010 (d=4)
    L'opération a&mask va faire un ET binaire bit à bit entre la valeur de a et mask.
    Le signe ! va inverser le résultat. Si (a&mask) = 0 alors !(a&mask) = 1, si (a&mask) <> 0 alors !(a&mask) = 0.
    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
    Exemple pour d = 5 et a = 0xF0 :
    mask : 0000 0000 0000 0001 (d=0)
       a : 0000 0000 1111 0000 = a & mask = 0 ==> !(a &mask) = 1
     
    mask : 0000 0000 0000 0010 (d=1)
       a : 0000 0000 1111 0000 = a & mask = 0 ==> !(a &mask) = 1
     
    mask : 0000 0000 0000 0100 (d=2)
       a : 0000 0000 1111 0000 = a & mask = 0 ==> !(a &mask) = 1
     
    mask : 0000 0000 0000 1000 (d=3)
       a : 0000 0000 1111 0000 = a & mask = 0 ==> !(a &mask) = 1
     
    mask : 0000 0000 0001 0000 (d=4)
       a : 0000 0000 1111 0000 = a & mask = 1 ==> !(a &mask) = 0
    L'opération b&mask va faire un ET binaire bit à bit entre la valeur de b et mask.

    Le test (!(a&mask)&&(b&mask)) sera VRAI si !(a&mask)=1 ET (b&mask)=1.

    La fonction retournera la valeur d-i si le même bit de a = 0 et de b = 1.

    Pour mieux comprendre le fonctionnement, n'hésite pas à mettre de l'affichage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int Deplace(int a,int b,int d)
    {   int i ;
        int mask = 0x0001 ; 
     
        printf("a = %Xh    b = %Xh    d = %d\n", a, b, d) ;
        for(i=0; i<d; i++, mask<<=1) {
            printf("i = %2d    mask = %.4Xh    ", i, mask) ;
            printf("!(a & mask) = %d    ", !(a&mask)) ;
            printf(" (b & mask) = %d\n", b&mask) ;
            if(!(a&mask)&&(b&mask)) return(d-i) ;
        }
        return 0 ;
    }
    L'appel dans le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {   int a = 0x02,
            b = 0x08,
            d = 6 ;
     
        printf("Deplace(%xh, %xh, %d) = %d\n", a, b, d, Deplace(a, b, d)) ;
    }
    a = 2h b = 8h d = 6
    i = 0 mask = 0001h !(a & mask) = 1 (b & mask) = 0
    i = 1 mask = 0002h !(a & mask) = 0 (b & mask) = 0
    i = 2 mask = 0004h !(a & mask) = 1 (b & mask) = 0
    i = 3 mask = 0008h !(a & mask) = 1 (b & mask) = 8

    Deplace(2h, 8h, 6) = 3
    Bonne continuation.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    L'opérateur "&" permet d'effectuer un "ET" binaire sur chacun des bits.
    La variable "mask" est initialisée à 1, puis à chaque tour de boucle, les bits sont décalés d'un cran à gauche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    76543210 <- numéro du bit
     
    00000001 <- 1er tour de boucle
    00000010 <- 2eme tour de boucle
    00000100 <- 3eme tour de boucle
    etc
    La condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    !(a & mask) && (b & mask)
    se découpe en deux parties :

    1) Ici, on teste le nième bit de "a", puis de renverser le résultat (à cause du "!"). Ce test renvoie donc vrai si le nième bit est à 0.

    2) Ici, on teste le nième bit de "b". Ce test renvoie donc vrai si le nième bit est à 1.

    3) Le "&&" est l'opérateur ET, et renvoie 1 (vrai) si les deux opérandes sont vraies, c'est-à-dire ici si le nième bit de "a" vaut 0, et celui de "b" vaut 1.

    Le but de la manoeuvre est donc de trouver à quelle position, à partir de la droite, se trouve un bit de "a" à 0 et, à cette même position, un bit de "b" à 1.
    Si c'est le cas, la fonction renvoie "d - i", "i" étant cette position. Je suppose que "d" est la taille du type en question.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    d = 8 (taille de "a" et "b")
    
        76543210 <- numéro du bit
    a = 00010011
    b = 10010110
    Position trouvée : 2
    La fonction renvoie 8 - 2

Discussions similaires

  1. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  2. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  3. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  4. Comment débuter en programmation ?
    Par Marc Lussac dans le forum Débuter
    Réponses: 0
    Dernier message: 08/04/2002, 11h29
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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