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 :

stocker une suite quelconque d'octets


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 123
    Points : 84
    Points
    84
    Par défaut stocker une suite quelconque d'octets
    Bonjour à tous,

    Pardon si ma question est idiote, mais j'ai beau chercher (notamment avec les pointeurs) je ne vois pas comment faire... Je souhaiterais pouvoir faire des opérations bit à bit (ET, OU, peu importe) sur deux suites d'octets de longueur définies, en une seule fois. Autrement dit, je souhaiterais pouvoir stocker dans deux variables, disons a et b, des suites quelconques d'octets (10 octets, 500 octets, etc.), et pouvoir écrire et obtenir directement a | b (ou a & b), sans avoir à utiliser une boucle itérative pour faire mon opération sur chaque octet.
    Est-ce possible?
    Things working well, no problems. Time to upgrade.

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Salut,

    la réponse est basiquement : non, il faut se taper le code.
    Néanmoins, suivant les architectures, tu peux tirer profit de certaines instructions vectorielles. Mais il faut pour cela utiliser des extensions des compilateurs (qui peuvent les utiliser d'office lors de la phase d'optimisation). Cela se limite en général sur lex x86 à une largeur de 128 bits.

    Je suppose que c'est pour optimiser un code ?

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonjour,

    Non, tu ne peux pas t'en sortir en C sans utiliser de boucle. Par contre, tu peux éventuellement définir une fonction qui le fasse :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdlib.h>
     
    unsigned char * bitwise_or (unsigned char *a,unsigned char *b,unsigned int l)
    {
        unsigned char * ret = NULL;
     
        if (a!=NULL && b!=NULL)
        {
            ret = malloc(l);
            if (ret!=NULL) while (l) { --l; ret[l] = a[l] | b[l]; }
        }
     
        return ret;
    }

    Ça marche, mais il te faudra penser à libérer toi-même le résultat avec free().

    Tu pourrais éventuellement t'en sortir en C++ en définissant une classe agissant comme une chaîne et en redéfinissant les opérateurs.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 123
    Points : 84
    Points
    84
    Par défaut
    C'est effectivement pour tenter d'optimiser un code.
    Merci pour vos réponses en tout cas!
    Things working well, no problems. Time to upgrade.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par ben53 Voir le message
    C'est effectivement pour tenter d'optimiser un code.
    Sache que les compilateurs modernes sont devenus réellement très efficaces à ce petit jeu. Essaie de compiler le code ci-dessus avec les options de compilation poussées au maximum et de voir quel code assembleur il produit. Parfois il ne se passe rien mais souvent, c'est bluffant.

    Si ce n'est pas suffisant, tu peux essayer écrire un peu d'assembleur inline en utilisant par exemple les instructions d'itération des x86 ou assimilés, si tu travailles sur PC. L'inconvénient, c'est que tu ne pourras plus compiler ton programme sur d'autre architectures.

    Merci pour vos réponses en tout cas!
    À ton service mais n'oublie pas !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/01/2014, 14h26
  2. convertir une structure en une suite de doubles octets
    Par dedibox26 dans le forum Débuter
    Réponses: 6
    Dernier message: 29/04/2010, 23h11
  3. Réponses: 9
    Dernier message: 08/04/2009, 13h44
  4. [MySQL] Quel est le meilleur moyen de stocker une date/heure ?
    Par MiJack dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 31/07/2004, 12h19
  5. Réponses: 6
    Dernier message: 04/03/2004, 09h35

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