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 :

[debutant] question en C : réduction du nbre de bits


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 14
    Points : 2
    Points
    2
    Par défaut [debutant] question en C : réduction du nbre de bits
    une petite question toute bête : comment réduire le nombre de bits d'une variable ?

    Je m'explique : j'ai un signal stocké par exemple dans une variable A codée sur 32 bits que je veux transmettre à la variable B qui elle n'a que 12 bits. Quelle traitement faire subir à A afin de diminuer sa dynamique de 32 à 12 bits en "dégradant" le moins possible mon signal ?

    Merci pour vos lumières..

  2. #2
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bonjour,
    heu ce que tu cherches à faire est dangereux, à moins que tu ne soit sur de quelle partis des bits de A tu peux abandonné.

    Je m'explique, soit donc A sur 4 bits :
    10XX
    On est sur que les bits sig,ificatifs sont dans le poids fort, on utilise une opération booléenne pour les récupérés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Result = 10XX &  1100;
    Result vaut alor:
    1000
    Maintenant, on effectue un décalage à droite de 2 bits:
    ET ainsi, Result vaut 10.

  3. #3
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Il est clair que ça dépend de la gestion de la donnée.
    On peut faire dire ce qu'on veut à une séquence de bits.

    Mais il est clair que dans ton cas détérioration il y aura.
    Si ta variable sur 32 bits est interprétée comme un nombre pur et simple
    32 bits => de 0 à (2^32)-1
    12 bits => de 0 à (2^12)-1

    pour avoir quelquechose de plus causant
    disons qu'on a une donnée en 8 bits et une autre en 3 bits
    8 bits => de 0 à 255
    3 bits => de 0 à 7

    Ce qui fait que tu vas obligatoirement perdre de l'information.
    ça dépend de la façon dont tu sers de la donnée.

    Peut être un peu plus de concret dans ton problème aiderait à t'aider. ( )
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Caine
    heu ce que tu cherches à faire est dangereux
    ..mais je n'ai pas le choix: j'ai un convertisseur N/A qui ne travaille que sur 12 bits alors que la variable numérique à convertir est sur 32 bits.

    Citation Envoyé par Caine
    à moins que tu ne soit sur de quelle partis des bits de A tu peux abandonné.
    justement non: dans mon cas, tous les bits ont le même poids, d'où ma question.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ggnore
    Mais il est clair que dans ton cas détérioration il y aura.
    Si ta variable sur 32 bits est interprétée comme un nombre pur et simple
    32 bits => de 0 à (2^32)-1
    12 bits => de 0 à (2^12)-1
    Je suis tout à fait d'accord avec toi et je ne cherche pas à l'éviter mais à avoir une bonne conversion.

    Pour être plus précis: je prends le cas où je veux passer de A qui contient un signal sur 4 bits (pouvant prendre 16 valeurs toutes de même poids) à B qui est sur 2 bits (4 valeurs possibles). Là, "intuitivement" je regrouperais par paquet de 4: à savoir:
    pour A= 0 à 3==> B=0
    pour A= 4 à 7==> B=1

    etc..

    mais pour passer de 32 à 12 je vois pas surtout que 32 ne se divise pas par 12 donc ce n'est pas la bonne méthode et là je coince...

  6. #6
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    32 se divise mal par 12

    mais 2^32 se divise très bien par 2^12
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par netpit
    ..mais je n'ai pas le choix: j'ai un convertisseur N/A qui ne travaille que sur 12 bits
    la je comprend que tu n'aille pas le choix!
    Citation Envoyé par netpit
    alors que la variable numérique à convertir est sur 32 bits.
    mais là tu ne peut pas changer?

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par gege2061
    mais là tu ne peut pas changer?
    c'est justement ma question! Comment faire pour la faire "rentrer" dans 12 bits de la bonne manière (en admettant la dégradation, ça c'est pas un problème, 12 bits étant satisfaisant en fait)

  9. #9
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    2^32 / 2^20 = 2^12
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  10. #10
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par netpit
    Citation Envoyé par gege2061
    mais là tu ne peut pas changer?
    c'est justement ma question! Comment faire pour la faire "rentrer" dans 12 bits de la bonne manière (en admettant la dégradation, ça c'est pas un problème, 12 bits étant satisfaisant en fait)
    Je pense que l'a il nous faudrait le contenue de ta variable de 32 bits et sa création...
    Et si tu transforme ta variable de 32 bits en une de 8 bits, ce sont des multiples et 8bits rentrent dans 12

  11. #11
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par ggnore
    2^32 / 2^20 = 2^12
    Trés construction tu ça

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ggnore
    2^32 / 2^20 = 2^12
    .... conclusion ? Je sais que je perd 20 bits dans l'affaire mais ça ne m'avance pas...

  13. #13
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Je sais que c'est laid.
    Je sais pas si ça marche, mais ...

    je me disais bêtement que tu pouvais convertir ta donnée sur 32 bits en décimal, diviser cette valeur par 2^20 et ainsi tu aurais une donnée tenant dans 12 bits.

    C'est marrant, ça tient en une phrase, mais au niveau code, je pense que c'est autre chose ...
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ggnore
    je me disais bêtement que tu pouvais convertir ta donnée sur 32 bits en décimal, diviser cette valeur par 2^20 et ...


    ... et j'arrondi le résultat au nombre entier le plus proche: oui, c'est ça!!

    Ex: pour passer de 3 bits à 2 bits: je divise par 2^1=2 d'où:
    A=7 ==> B=7/2 soit B=3
    et encore:
    A= 3 ==> B= 3/2 soit B=1

    J'utiliserai le modulo.

    Merci ggnore

  15. #15
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    en faisant quelques tests bêta sur le papier ça me paraît marcher, mais ...
    Je suis sûr qu'il y a une meilleure méthode.

    Peut être que la bonne fée Emmanuel Delahaye se penchera sur ton berceau.

    Sinon tu peux aussi aller faire un tour dans le forum algorithme
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  16. #16
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut

    Il faut prendre les 12 bits de poids faible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int longval; // valeur à convertir sur 12 bits
    short int val = (short int) (longval & 0x000007FF)
    Mais évidemment, tu perds de l'information.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Trap D
    Salut

    Il faut prendre les 12 bits de poids faible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int longval; // valeur à convertir sur 12 bits
    short int val = (short int) (longval & 0x000007FF)
    et les 20 autres bits je les passe en pertes et profits ?

  18. #18
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Trap D
    Il faut prendre les 12 bits de poids faible.
    En plus le Monsieur à dit que ses bits avaient tous le même poid!

  19. #19
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Désolé dans un octet, un nombre, on a les bits de poids faibles et les bits de poids forts, je n'y peut rien
    Maintenant, pour récupérer lesautres bits tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int longval; // valeur à convertir sur 12 bits
    // recupération des 12 "premiers" bits
    short int val1 = (short int) (longval & 0x000007FF)
    // recupération des 12  bits suivant
    short int val2 = (short int)((longval & 0x00FF7000) >> 12);
    // recupétration des 8 derniers bits
    short int val3 = (short int)(((longval & 0xFF000000) >> 24) & 0x000000FF);
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  20. #20
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Moi, je ferai plutôt un décalage à droite de 20 positions (ou une division par 2^20), suivi d'un masquage (inutile, normalement, mais prudent) pour ne garder que les 12 bits de poids faible (qui étaient les 12 de poids fort sur le codage 32 bits).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    unsigned int val12, val32;
     
    val32 = 65535 ; /* Pour l'exemple ! */
    val12 = (val12 >> 20) & 0x00000FFF ;
    Je n'ai pas testé, mais on doit y être, non ?

    Après, la gestion éventuelle des valeurs signées est un autre problème ...
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [Debutant] Question sur le system.out.print
    Par thom02 dans le forum Langage
    Réponses: 8
    Dernier message: 19/07/2005, 18h19
  2. [debutant]Question technique
    Par toto4650 dans le forum Débuter
    Réponses: 23
    Dernier message: 13/07/2005, 02h06
  3. [debutant]Question toute bete sur le messages
    Par flogreg dans le forum Servlets/JSP
    Réponses: 18
    Dernier message: 09/09/2004, 09h07
  4. [debutant] Questions a propos du XML
    Par brune dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 04/06/2004, 09h39
  5. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49

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