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

Algorithmes et structures de données Discussion :

Opérations bit à bit


Sujet :

Algorithmes et structures de données

Vue hybride

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 87
    Par défaut Opérations bit à bit
    Bonjour,
    je ne savais pas ou mettre ca, j'ai un petit problème mathématique, voici une petite équation :

    x = 1111 & (1000100011100110111001001110001 >> 8);
    x = 1111 & (10001000111001101110010);
    x = 10;

    Ok, voila maintenant en connaissant x, je voudrais retrouver 8 que j'appelle y plus bas :

    10 = 1111 & (1000100011100110111001001110001 >> y);

    Quelles sont les étapes pour retrouver y = 8 ?

    Merci de votre aide.

  2. #2
    Membre éprouvé
    Inscrit en
    Décembre 2004
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 119
    Par défaut
    Deja, je ne comprends pas comment tu passes de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    10 = 1111 & (1000100011100110111001001110001 >> y);
    a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    10 & 1111 = 10001000111001101110010 >> y;
    sachant que :
    considerons a=0, b=1, c=0,
    a = b & c est vrai, mais a & c = b est faux.

    Et qu'en plus tu as shifte la valeur 1000100011100110111001001110001 de 8 mais maintenu le shift dans l'equation.

    Je ne comprends pas bien la logique de tout ca, je l'avoue. :-?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 87
    Par défaut
    effectivement j'avais déja fait ces erreurs,
    j'ai édité mon premier post,
    reste toujours que je n'arrive pas a retrouver la valeur 8 pour mon y

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    il n'est pas possible de trouver la solution sans passer par la méthode tu "trial and error", car l'opération de shift n'est pas réversible (elle engendre une perte d'information).

    Théoriquement, il y a trois réponses valables pour l'opération : y = 8 ou 25 ou 29. (la dernière réponse (29) est sujette à caution, si il y a injection de bits à zéro sur la gauche durant le décalage, cela fonctionne).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    x = 1111 & (1000100011100110111001001110001 >> 25);
    x = 1111 & (100010);
    x = 10;
     
    --------------------
     
    x = 1111 & (1000100011100110111001001110001 >> 29);
    x = 1111 & (10); // ok si injection de 0 sur la gauche lors du shift à droite
    x = 10;
    Pour retrouver au moins la première réponse il faut partir du nombre à décaler et à chaque décalage regarder si les 4 bits à droite valent '0010'. En gros il suffit juste de trouver le pattern '0010' (soit 2 en décimal) dans le nombre à décaler.

    soit : x = z & (w >> y)

    x := 0; // résultat
    z := 15; // 1111b (constante)
    w := 1148416625; // chiffre à décaler
    y := -1; // compteur décalage


    FAIRE
    y := y + 1;
    x := z & (w >> y);
    TANTQUE x != 2

    en C :

    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
     
    int main (void)
    {
         int z = 15;
         int w = 1148416625;
         int y = -1;
         int x = 0;
     
    	do{
    		y ++;
    		x = z & (w >> y);
    	}while (x != 2);
     
    	printf ("resultat : %i", y);
     
    	return 0;
    }
    resultat : 8

    J'espère que ca t'aidera un petit peu.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 87
    Par défaut
    Citation Envoyé par Neitsa
    Pour retrouver au moins la première réponse il faut partir du nombre à décaler et à chaque décalage regarder si les 4 bits à droite valent '0010'. En gros il suffit juste de trouver le pattern '0010' (soit 2 en décimal) dans le nombre à décaler.
    Ici tu prend 0010 car tu connais la valeur :
    10001000111001101110010
    qui est justement la valeur que l'on souhaite retrouver en partant de la :

    10 = 1111 & (1000100011100110111001001110001 >> y);

    C'est bien ca ?
    en faite j'aimerai faire comme si je ne connais pas le décalage a l'origine.

    Merci pour vos réponses

  6. #6
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut
    Ici tu prend 0010 car tu connais la valeur :
    10001000111001101110010
    qui est justement la valeur que l'on souhaite retrouver en partant de la :

    10 = 1111 & (1000100011100110111001001110001 >> y);
    non c'est valable si on connais pas "y" car tu doit chercher la premiere occurence où on a 1111 & 0010 = 10
    autrement dit on veux trouver ça:

    ************0010*****
    & 0000000000001111
    ----------------------------
    = 0000000000000010

    "y" sera le nombre des (*) à droite de 0010

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Il y a plusieurs solutions possibles. Je ne vois guère que d'essayer toutes les possibilités et éliminer celles qui ne vont pas.

  8. #8
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Il y a plusieurs solutions possibles. Je ne vois guère que d'essayer toutes les possibilités et éliminer celles qui ne vont pas.
    Je dirais ça aussi, en plus il n'y en a pas tant que ça, il n'y a que 32 possibilités maxi (sur un int)...

Discussions similaires

  1. Opérations bit à bit sur un pointeur.
    Par valefor dans le forum C++
    Réponses: 7
    Dernier message: 05/01/2012, 16h37
  2. Opérations bit à bit
    Par bsangoku dans le forum Débuter
    Réponses: 2
    Dernier message: 02/02/2010, 11h13
  3. Operations bit à bit sur des structures
    Par DarkNagash dans le forum C
    Réponses: 4
    Dernier message: 16/03/2006, 13h59
  4. Entier : accès bit à bit
    Par slylafone dans le forum C++Builder
    Réponses: 16
    Dernier message: 14/06/2005, 20h34
  5. Réponses: 5
    Dernier message: 03/06/2005, 14h06

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