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

  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
    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é...

  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
    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

  6. #6
    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.

  7. #7
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    737
    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 : 737
    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.

  8. #8
    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.

  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

  11. #11
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 786
    Par défaut
    Bof c'est plus simple de faire comme cela, define ou function au choix:

    Il faut utiliser des unsigned char

    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
    30
    31
    32
    33
    #define GET_CHAR(VAL) \
        ((VAL == 0x00)? 'A': ((VAL == 0x01)? 'C': ((VAL == 0x10)? 'G': 'T' /*0x11*/)))
     
    #define GET_VALUE(CHAR) \
        ((CHAR == 'A')? 0x00: ((CHAR == 'C')? 0x01: ((CHAR == 'G')? 0x10: 0x11 /*'T'*/)))
     
    #define GET_FIRST(VAL, CHAR) \
       CHAR = GET_CHAR((VAL & 0x03));
     
    #define GET_SECOND(VAL, CHAR) \
       CHAR = GET_CHAR(((VAL & 0X0C) >> 2));
     
    #define GET_THIRD(VAL, CHAR) \
       CHAR = GET_CHAR(((VAL & 0X30) >> 4));
     
    #define GET_FOURTH(VAL, CHAR) \
       CHAR = GET_CHAR(((VAL & 0XC0) >> 6));
     
    #define SET_FIRST(VAL, CHAR) \
       VAL &= 0XFC; \
       VAL += GET_VALUE(CHAR);
     
    #define SET_SECOND(VAL, CHAR) \
       VAL &= 0XF3; \
       VAL += (GET_VALUE(CHAR) << 2);
     
    #define SET_THIRD(VAL, CHAR) \
       VAL &= 0XCF; \
       VAL += (GET_VALUE(CHAR) << 4);
     
    #define SET_FOURTH(VAL, CHAR) \
       VAL &= 0X3F; \
       VAL += (GET_VALUE(CHAR) << 6);

  12. #12
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,
    Citation Envoyé par mido1951 Voir le message
    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.
    Quel est l'ordre de grandeur de ces séquences ? Quel est l'ordre de grandeur du nombre de séquences ?

    Comme le dit Leternel, le gain de place peut ne pas être significatif par rapport aux pertes de performances dues aux manipulations.

    Citation Envoyé par mido1951 Voir le message
    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?
    Merci
    Non tu ne pourras pas utiliser une chaîne de quad comme un char *. Il va falloir écrire toues les fonctions de manipulations et d'accès.

  13. #13
    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
    On a oublié de rappeler la base des problèmes d'optimisation:

    On n'optimise pas un code non fonctionnel.
    On n'optimise pas avant d'avoir mesuré ce qui en a besoin.

    Ecris du code fonctionnel, termine l'algorithme, et après seulement viendront les considérations d'optimisation.

  14. #14
    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 picodev Voir le message
    Bonjour,


    Quel est l'ordre de grandeur de ces séquences ? Quel est l'ordre de grandeur du nombre de séquences ?

    Comme le dit Leternel, le gain de place peut ne pas être significatif par rapport aux pertes de performances dues aux manipulations.



    Non tu ne pourras pas utiliser une chaîne de quad comme un char *. Il va falloir écrire toues les fonctions de manipulations et d'accès.
    j'ai environ 100.000 sequences avec la plus grande sequence est de 60.000 et une longueure moyenne de 6000.

  15. #15
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    j'ai environ 100.000 sequences avec la plus grande sequence est de 60.000 et une longueure moyenne de 6000.
    Donc en gros 600Mo en moyenne avec un grand maximum à 6Go. Pas la peine de se prendre la tête sur la place je pense. Il vaut mieux penser à bien gérer quelles séquences sont en mémoires à un moment donné. Enfin tout dépend de ce que tu fais avec.

    Comme te le conseille à juste titre Leternel, fait déjà un programme qui fonctionne. Ensuite un profiler te montreras où il est judicieux d'essayer d'optimiser le code.

  16. #16
    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
    100k * 60k = 6 Go
    soit environ 6 giga-octets, avec des caractères normaux.
    Il y a des chances que ton PC dispose de plus de RAM que cela. Surtout qu'il s'agit probablement de faire tourner ton programme sur une machine de calcul disposant de plus de RAM qu'un simple poste de travail.

    Poses-toi l'autre question: As-tu réellement besoin d'avoir toutes les séquences en mémoire simultanément?
    En général, non, seulement de deux ou trois.

    En effet, la quasi-totalité des algorithmes sont de la forme:
    soit un Bidule de référence
    pour chaque Bidule d'un ensemble donné,
        utiliser le Bidule courant avec le Bidule de référence
    retourner le résultat
    Et pour cela, il n'est pas nécessaire de charger tout l'ensemble intégralement en mémoire, mais simplement d'entrelacer la lecture du fichier contenant les séquences et le calcul.

    L'algo devient:
    soit un Bidule de référence
    pour chaque ligne du fichier,
        convertir la ligne en un Bidule
        utiliser ce Bidule avec le Bidule de référence
    retourner le résultat

Discussions similaires

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

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