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 :

Comment inverser les cases d'un tableau


Sujet :

C++

  1. #1
    Membre averti Avatar de FryHandiz
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Par d�faut Comment inverser les cases d'un tableau
    Bonjour,

    Je reviens pour une question assez stupide mais... �tant donn� que je suis d�butante, je gal�re un peu !
    Alors, je vais vous expliquer ce que je souhaiterais faire.

    J'ai une suite de lettres, une lettre est "cod�e" par deux bits. Donc je me retrouve avec 4 lettres dans chaque octet.
    Donc j'ai mon octet 0 (ATCG), mon octet 1 (CTTA) et mon octet 2 (AATT)
    ATCG CTTA AATT
    Je souhaite obtenir ma suite de lettre mais invers�e.
    TTAA ATTC GCTA

    Premier souci :
    Vu que je suis une quiche, pour le moment, j'ai juste r�ussi � inverser mes octets et obtenir �a :
    AATT CTTA ATCG
    Mais �a ne marche que pour des multiples de 4.
    Par exemple avec �a :
    ATCGCTTAAAT
    J'obtiens �a :
    AATACTTAATC
    Mon G disparait et me laisse place � un A.

    Voici ma boucle for :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    size_t longueur_tab = (longueur/4 + (longueur%4 !=0)), temp = 0;
        for (size_t i = 0 ; i < (longueur_tab/2) ; i++){
        	temp = tab[i];
            tab[i] = tab[longueur_tab - i -1];
            tab[longueur_tab - i - 1] = temp;
    	}
    longueur : est la taille de ma s�quence de A,T,C,G

    Donc je suppose qu'en fait, �a va me prendre mes lettres par groupe de 4 comme �a :
    ATC GCTT AAAT et pas comme �a ATCG CTTA AAT
    Que puis-je faire du coup...?


    Deuxi�me souci :
    Comment obtenir : TAA ATTC GCTA
    Si je ne dis pas de sottise, je crois que je dois manipuler les bits en utilisant <<
    Mais je ne vois pas trop comment faire �a, du moins, la logique utilis�e.
    Mais �a, on n'y est pas encore
    Si jamais vous avez des liens vers ce genre de choses qui semblent assez rudimentaires, je prends.

    Et merci d'avance pour votre aide !

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Le plus s�r, c'est d'isoler chaque composant avec les op�rateurs bitwise, puis les remettre dans l'ordre inverse:
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    unsigned char inverseParDeux(unsigned char entree)
    {
    	unsigned char duo0 = (entree >> 0) & 0x03;
    	unsigned char duo1 = (entree >> 2) & 0x03;
    	unsigned char duo2 = (entree >> 4) & 0x03;
    	unsigned char duo3 = (entree >> 6) & 0x03;
     
    	unsigned char sortie = (duo0 << 6) | (duo1 << 4) | (duo2 << 2) | (duo3 << 0);
    	return sortie;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti Avatar de FryHandiz
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Par d�faut
    Me frappez pas mais j'ai quelques questions
    Enfin, pour commencer d�j� une. Que fait & 0x03 ? '

  4. #4
    Membre averti Avatar de FryHandiz
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Par d�faut
    Et je viens de me rendre compte que ce que j'ai fait ne marche pas si mes lettres ne sont pas un multiple de 4... TT

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    & c'est l'op�rateur binaire ET bitwise, et 0x03 �a veut dire que seuls les deux bits de poids faible sont � 1. Donc, �a met tous les autres bits � z�ro.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti Avatar de FryHandiz
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Par d�faut
    Mmmh d'accord. Bon, finalement j'ai �dit� mon premier poste car je bloque un peu d�j� dans ma premi�re �tape >.<

  7. #7
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Hello,

    pour inverser les bits d'un octet, parcours-les du dernier au premier
    � vue de nez, ceci devrait marcher
    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
    #include <climits>
    #define GET_BIT(o,x) ((o) & (1<<(x)))
    #define INNER_CLEAR_BIT(o,x) (o & ~(1<<x))
    #define INNER_SET_BIT(o,x) (o | (1<<x))
    #define SET_BIT(o,x,b) o = (b) ? INNER_SET_BIT(o,x) : INNER_CLEAR_BIT(o,x)
     
    unsigned char reverse(unsigned char c)
    {
    	char r = 0;
    	for ( unsigned int i = 0; i < CHAR_BIT; ++i )
    	{
    		SET_BIT(r, i, GET_BIT(c, CHAR_BIT - i - 1));
    	}
    	return r;
    }
    Et si tu veux remplacer l'unsigned char par n'importe quel autre type, suffit d'adapter avec un sizeof
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  8. #8
    Membre averti Avatar de FryHandiz
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Par d�faut
    Merci beaucoup Bousk. Mais le probl�me c'est que je ne comprends pas trop ce que tu as fait. Je pr�f�re quelque chose de moins optimis� et de plus facile � comprendre pour moi >.<'

  9. #9
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Il n'y a absolument rien d'optimis� ou de myst�rieux dans mon code. C'est justement un simple algorithme qu'il suffit de lire/d�rouler pour le comprendre.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  10. #10
    Membre averti Avatar de FryHandiz
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Par d�faut
    En fait je ne comprends pas �a xD :
    #define GET_BIT(o,x) ((o) & (1<<(x)))
    #define INNER_CLEAR_BIT(o,x) (o & ~(1<<x))
    #define INNER_SET_BIT(o,x) (o | (1<<x))
    #define SET_BIT(o,x,b) o = (b) ? INNER_SET_BIT(o,x) : INNER_CLEAR_BIT(o,x)

    Pas tapeeeeeer !

  11. #11
    Membre exp�riment� Avatar de RPGamer
    Homme Profil pro
    Ing�nieur en syst�mes embarqu�s
    Inscrit en
    Mars 2010
    Messages
    168
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing�nieur en syst�mes embarqu�s

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Par d�faut
    Si les op�rations bit � bit ne sont toujours pas clair, je t'invites � relire mon post dans ton pr�c�dent sujet : http://www.developpez.net/forums/d15...n/#post8566949

    Pour ton tri, je pense que tu peux passer tes nucl�otides dans un tableau temporaire, les inverser puis recr�er ton tableau compress�.

    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
    std::vector<char> sequence{{...}};
     
    std::vector<char> tmp(sequence.size() * 4);
     
    for (size_t i = 0; i < sequence.size(); i++)
    {
        tmp[i] = sequence[i] & 0x03;
        tmp[i + 1] = sequence[i] & 0x0C;
        tmp[i + 2] = sequence[i] & 0x30;
        tmp[i + 3] = sequence[i] & 0xC0;
    }
     
    std::reverse(tmp.begin(), tmp.end());
     
    for (size_t i = 0; i < sequence.size(); i++)
    {
        sequence[i] = (tmp[i + 3] << 6) | (tmp[i + 2] << 4) | (tmp[i + 1] << 2) | tmp[i];
    }

  12. #12
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Citation Envoy� par FryHandiz Voir le message
    #define GET_BIT(o,x) ((o) & (1<<(x)))
    #define INNER_CLEAR_BIT(o,x) (o & ~(1<<x))
    #define INNER_SET_BIT(o,x) (o | (1<<x))
    #define SET_BIT(o,x,b) o = (b) ? INNER_SET_BIT(o,x) : INNER_CLEAR_BIT(o,x)
    Ce sont juste des macros pour manipuler des bits, leurs noms sont on ne peut plus explicites btw.
    Si tu ne parviens pas � les d�crypter, est-ce que ton probl�me ne serait pas juste que tu esp�res manipuler des bits sans savoir ce que c'est ni les op�rations �l�mentaires qui y sont li�es ?
    A ce moment-l� je t'invite � (re)lire ton cours, parce que si un tel exercice vous a �t� demand�, c'est que vous avez les billes pour parvenir � sa r�solution.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  13. #13
    Membre averti Avatar de FryHandiz
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 26
    Par d�faut
    Justement, le souci c'est qu'on n'a eu qu'un bref cours de C++ avec quelques petites bases et que notre enseignant souhaite qu'on r�alise un API de mapping. Enfin, c'est, pour quelqu'un comme moi qui n'a jamais fait d'informatique une t�che quasi impossible x) Mais j'avais au moins envie de faire cette petite �tape. Pour les bits, on nous a juste dit qu'un octet �tait constitu� de 8bits. Voil����
    Je vais regarder �a RPGamer, merci !

  14. #14
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par d�faut
    Pourtant ce sont des maths

    entr�e b = 00000001 (notation binaire), b = 0x01 (notation hexad�cimale) ou 1 (notation d�cimale)

    b << 3 -> d�calage � gauche de 3 bits, b << 3 = 00001000, b = 0x08 ou 8

    avec la nouvelle valeur de b:
    b >> 3 -> d�calage � droite de 3 bits, b >> 3 = 00000001, b = 0x01 ou 1


    Et il y aussi les tables AND (op�rateur &) et OR (op�rateur |)
    0 AND 0 = 0
    0 AND 1 = 0
    1 AND 0 = 0
    1 AND 1 = 1


    0 OR 0 = 0
    0 OR 1 = 1
    1 OR 0 = 1
    1 OR 1 = 1


    Exemple:
    a = 58 = 0x3A ou 00111010
    b = 111 = 0x6F ou 01101111

    a & b = 00111010 & 01101111 = 00101010 = 0x2A ou 42
    a | b = 00111010 | 01101111 = 01111111 = 0x7F ou 127

Discussions similaires

  1. Inverser les bits d'un entier (mirroir)
    Par Raikyn dans le forum D�buter
    R�ponses: 8
    Dernier message: 04/03/2012, 14h08
  2. R�ponses: 3
    Dernier message: 12/01/2011, 11h51
  3. R�ponses: 19
    Dernier message: 17/01/2008, 23h43
  4. comment restaurer les bits du registre ISR au niveau du PIC
    Par amaradelll dans le forum Composants
    R�ponses: 1
    Dernier message: 23/02/2007, 18h33
  5. R�ponses: 7
    Dernier message: 14/02/2006, 16h55

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