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 :

codage des caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut codage des caractères
    Bonjour,

    Je veux savoir comment coder des caractères en 2 bit.
    je veux gagner de la mémoire et j'ai 4 caractère à coder donc comment coder ces 4 caractères en binaire?
    Merci

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    En manipulant les bits d'une variable de type char.
    les opérateurs dédiés sont:
    • & et | pour faire les AND et OR bit par bit: ainsi, 17 & 0001b = 0001b car 17 = 10001b)
    • << et >> pour décaler les bits d'un nombre:par exemple, 1<<2 devient 4 (car 1= 0001b et 0100b=4)
    • éventuellement, ~ pour l'inverse binaire

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    merci pour ta réponse mais je n'ai pas compris.
    est-ce que je peux avoir un exemple?
    Merci et désolé. J'ai jamais utilisé ce genre de codage.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    En fait, il y a une bonne raison pour laquelle tu ne l'a jamais fait: c'est rarement utile.

    Qu'essaie-tu de faire avec ca?
    char est la taille la plus petite pour une variable.
    Tu peux essayer de stocker deux valeurs en même temps dans un char, si tu parviens à trouver un moyen de les séparer.
    Le problème, c'est que du coup, chaque utilisation de la variable est plus lente, car tu ne peux manipuler que des chars (la faute au processeur )

    La difficulté, ce n'est pas de stocker des choses ne différant que sur 2 bits, mais de stocker 2 choses distinctes (voire 4, dans ton cas) dans une seule variable.
    les bits fields peuvent clairement servir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struc quad_value {
    unsigned char a:2;
    unsigned char b:2;
    unsigned char c:2;
    unsigned char d:2;
    };
    un peu de documentation: http://en.cppreference.com/w/c/language/bit_field

    Cela dit, voici un exemple pour les manipulations par bits:
    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
     
    typedef unsigned char meteo_t;
    meteo_t const masque_temperature=0x01;//premier bit
    meteo_t const temperature_froid = 0x00;
    meteo_t const temperature_chaud = 0x01;
     
    meteo_t const masque_vent=0x06;//deuxième et troisième bits
    meteo_t const vent_aucun = 0<<1;
    meteo_t const vent_faible = 1<<1;
    meteo_t const vent_moyen = 2<<1;
    meteo_t const vent_fort = 3<<1;
     
    void f() {
        meteo_t meteo = temperature_froid | vent_fort;
        //le | crée une valeur dont chaque bit est actif si le bit correspondant est actif dans au moins un opérande.
     
        if ((meteo & masque_temperature == temperature_froid)) {
            printf("froid");
        } else {
            printf("chaud");
        }
     
        switch (meteo & masque_vent) {
            case vent_aucun: printf("pas de vent"); break;
            case vent_faible: printf("peu de vent"); break;
            case vent_moyen: printf("venteux"); break;
            case vent_fort: printf("vent violent, soyez prudent."); break;
        }
    }
    J'imagine bien que tu manipule quatre constantes du type A, T, C et G, représentable par les entiers 0,1,2,3.

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    Citation Envoyé par leternel Voir le message
    En fait, il y a une bonne raison pour laquelle tu ne l'a jamais fait: c'est rarement utile.

    Qu'essaie-tu de faire avec ca?
    char est la taille la plus petite pour une variable.
    Tu peux essayer de stocker deux valeurs en même temps dans un char, si tu parviens à trouver un moyen de les séparer.[/CODE]

    J'imagine bien que tu manipule quatre constantes du type A, T, C et G, représentable par les entiers 0,1,2,3.
    oui mes caractères sont A, T, C et G.
    en fait, j'ai de longues sequences et si je code chaque caractère sur 8bit ça prend bcp de mémoire donc je dois minimiser la taille de ces caractères pour qu'ils ne prennent pas bcp de mémoire (8 bit). 2 bit est suffisant.
    et je n'ai jamais fait ce genre de manipulation en C. c'est pour ça je veux de l'aide sur la manipulation de ce genre variable.
    parce que je ne peux pas definir une sequence de chaine de caratères char*.
    Alors comment definir une sequence de chaine de caractere avec les caracteres qui prennes 2 bit seulement en mémoire??
    Merci

    Citation Envoyé par Daïmanu Voir le message
    Simple question, quels caractères tu veux encoder ?
    A, C, G et T.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    639
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 639
    Par défaut
    Bonjour,

    une vidéo qui parle des "champs de bits". Les manipulations permettant d'accéder séparément à n'importe quel bit y sont expliquées :




    Mais ce n'est pas niveau bébé...

  7. #7
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    j'ai dit que j'ai 4 caractères et je veux coder ces caractères en 2 bits et non pas sur 8bit (le cas d'un caractère) pour gagner en mémoire.
    Je veux avoir un exemple de code en C pour un codage de caractère en 2 bits.
    merci

  8. #8
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 730
    Par défaut
    Bonjour.

    Simple question, quels caractères tu veux encoder ?
    Sur 2 bits, il n'y a que 4 combinaisons de bits possibles, 00, 01, 10 et 11, et donc 4 éléments encodables.

    Tu dois savoir qu'en C, on ne peut pas avoir de variable de taille inférieurs à un char, qui a une taille de 1 byte (8 bits sur la majorité des systèmes).
    Si tu veux utiliser 2 bits, tu dois "découper" des chars avec des champs de bits comme l'a dit CodeurPlusPlus, et utiliser les opérateurs présentés par leternel.

    Mais sache que, à moins que tu as un besoin absolu et critique d'économiser la mémoire, on préfère éviter ce genre de technique car ça demande beaucoup de code pour au final un gain faible.

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Entre temps, j'ai modifié mon message précédent, pour rajouter une précision sur les bitfields.

    Tu peux faire une séquence de quad_value.
    Si tu connais à l'avance la taille de chaque séquence, ou au minimum une taille maximale, et tu peux utiliser un tableau "dynamique" de quad_value (c'est à dire un pointeur et un malloc(N*sizeof(quad_value))).

    Sinon, il te faut passer par une liste chainée, et tu perds tout le gain envisagé, un pointeur coutant au moins 32 bits.
    Tu peux mitiger cela avec une liste de petits tableaux (par exemple une 32-sizeof(pointeur)).

  10. #10
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    d'accord donc je dois juste declarer le quad_value puis je fais une allocation d'une chaine de caractère de quad_value et j'utilise la chaine comme d'habitude?

    Declaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struc quad_value {
    unsigned char a:2;
    unsigned char b:2;
    unsigned char c:2;
    unsigned char d:2;
    };
     
    quad_value* chaine= malloc(N*sizeof(quad_value))); //pour la declaration de chaine
    c'est ça?
    Merci

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/05/2008, 00h48
  2. Réponses: 3
    Dernier message: 15/02/2008, 18h19
  3. codage des caractères accentués
    Par grinder59 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 27/08/2007, 22h41
  4. Fil RSS et codage des caractères
    Par komoku dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2007, 12h52
  5. Problème codage des caractères
    Par webrider dans le forum Requêtes
    Réponses: 1
    Dernier message: 29/06/2006, 21h32

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