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 :

inverser un nombre binaire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut inverser un nombre binaire
    Bonsoir à tous,

    Je voudrais inverser un nombre binaire de manière optimale (obtenir son palindrome). J'ai déjà vu la discussion "inverser nombre binaire" avec deux bouts de code mais je ne sais pas s'ils sont optimaux.

    Voici un exemple de nombre binaire :Merci de votre aide

    Christophe

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Salut
    Si ton nombre ne dépasse pas l'octet de ton exemple, le plus rapide est de passer par un tableau...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char tab[256]={
        0b00000000,
        0b10000000,
        0b01000000,
        0b11000000,
        0b00100000,
        ...
    }
    printf("Inverse de 0b10000011 est %x\n", tab[0b100000011]);
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Merci pour votre réponse, effectivement, je ne dépasse pas l'octet.

    Cependant, je ne comprends pas complètement l'idée du tableau. A ce que je vois, il contient tout les cas possibles de palindrome correspondant à la valeur de mon binaire à la position de la valeur de mon binaire ?

    Merci encore,

    Christophe

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    C'est exactement ça. C'est le principe d'une lookup table (que Wikipedia traduit par table de correspondance, donc c'est bien ce que Svr@r te propose ^^). Ton nombre binaire donne un indice du tableau, et à cet indice tu stockes le résultat.

    Idem si tu voulais trouver la correspondance entre un chiffre (0, 1, 2....) et la chaine de caractère correspondante ("un", "deux", "trois"), tu ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        const char * lookup[] = {"Zero", "Un", "Deux", "Trois"};
        printf("%d = %s\n\n", 2, lookup[2]);
    Et ben là, c'est pareil ^^

    C'est optimal dans ton cas car il n'y a quasiment rien à faire (une addition, une lecture).

    Au passage, je crois que l'écriture 0b00000000 n'est pas standard (c'est une extension de GCC, p-e faite par d'autres compilateurs).

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char octet = 14;
    char palindromeDeOctet = tab[octet];
    A chaque valeur de "octet" possible, on associe son palindrome.
    On a donc tous les couples "octet"-palindrome possibles.
    "octet" est donc la clé et palindrome la valeur, ce qui permet d'accéder directement au palindrome en connaissant "octet".

    On peut aussi accéder à "octet" directement en connaissant son palindrome vu que "octet" est le palindrome de son palindrome.



    Pour un octet, la solution du tableau est la plus efficace.
    Si ensuite tu as plusieurs octets "entiers" il vaudra mieux alors utiliser ce même tableau pour calculer les palindrome de chaque octet puis faire un parcours à partir de la fin ET du début de ton tableau de palindrome ainsi obtenu en intervertissant tabResultat[i] et taResultat[Taille - i] et tu arrêteras le parcours lorsque i >= Taille - i.


    Si tu as un nombre de bit non divisible par 8, je pense que le plus simple est de jouer avec les décalages et les masques pour obtenir "à droite" et "à gauche" un maximum d'octets complet pour utiliser la méthode précédente.

    Exemple, si tu as 20 bits, ceci te fait 2,5 octet. Il te manque 4 bits pour avoir un octet complet.
    Tu va donc décaler tous les bits de la moitié "droite" de 4 bits.
    Pour obtenir quelque chose comme ceci :
    8 | <= partie gauche | 4 | <= milieu | 8 | <= partie droite

    On ignore donc la partie du milieu et on calcule le palindrome de la partie gauche + partie droite.
    Ensuite on calcule le palindrome de la partie du milieu bit après bit ou on utilise un tableau de palindrome Palindrome = tab[nbBit][Valeur].
    Et enfin, on fusionne le tout.

    Si au milieu, on se retrouve avec un nombre de bit > 8 pair, on va effectuer le palindrome des 8 bits au milieu et on calculera les palindromes des bits restants.

    Si le nombre de bit est impair et > 8, on va enlever le bit au milieu pour utiliser la solution précédente puis on le réinjectera par la suite.

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Citation Envoyé par christophe_halgand Voir le message
    Je voudrais inverser un nombre binaire de manière optimale (obtenir son palindrome). J'ai déjà vu la discussion "inverser nombre binaire" avec deux bouts de code mais je ne sais pas s'ils sont optimaux.
    Tu ne trouveras pas meilleur que l'acces au tableau - mais celui-ci impose de connaitre la taille maximale des donnees.

    Sinon, le code le plus simple doit etre le xor avec le meme nombre de bits que ton nombre, mais a 1 :
    001100 ^ 111111 = 110011

    Moins optimal car necessite des calculs.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Bonjour,



    Tu ne trouveras pas meilleur que l'acces au tableau - mais celui-ci impose de connaitre la taille maximale des donnees.

    Sinon, le code le plus simple doit etre le xor avec le meme nombre de bits que ton nombre, mais a 1 :
    001100 ^ 111111 = 110011

    Moins optimal car necessite des calculs.
    Il souhaite obtenir un palindrome :
    110001 -> 100011

    Or tu lui proposes :
    110001 -> 001110

  8. #8
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    @gangsoleil: on veut le palindrome, pas l'inverse

    Trouver le palindrome d'un nombre binaire à exactement la même complexité que trouver le palindrome d'un string, c'est-à-dire O(n/2) = O(n) sur le nombre caractère (ou bit).

    L'algo basique c'est partir des deux bout et d'inverser à chaque fois les deux bit jusqu'à ce qu'on arrive au milieu. Tu peux le faire avec les opérateurs ">>", "<<", et "|".

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Voir aussi la discussion Inversion de bits d'un octet

    Notamment ce message, qui présente une méthode qui peut s'étendre avantageusement et facilement à des données plus grosses qu'un octet.

  10. #10
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Effectivement, je me suis laisse abuser par la phrase suivante et ai un peu zappe ce qui etait entre paretheses. Mea culpa.

    Citation Envoyé par christophe_halgand Voir le message
    Je voudrais inverser un nombre binaire de manière optimale (obtenir son palindrome).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

Discussions similaires

  1. inverser bits d'un nombre binaire
    Par jojo_ol76 dans le forum MATLAB
    Réponses: 7
    Dernier message: 09/11/2007, 10h05
  2. [VBA-E]Inversion d'un nombre binaire
    Par Chemou dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 04/05/2006, 08h36
  3. Affichage d'un nombre binaire
    Par Jero13 dans le forum C
    Réponses: 5
    Dernier message: 05/12/2005, 22h17
  4. conversion nombre binaire -> decimal
    Par spoun95 dans le forum Langage
    Réponses: 7
    Dernier message: 25/11/2005, 17h46
  5. Réponses: 6
    Dernier message: 28/07/2005, 21h14

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