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 :

Comprendre un code utilisant le décalage de bits


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 126
    Points : 58
    Points
    58
    Par défaut Comprendre un code utilisant le décalage de bits
    Bonjour a tous j'aurai besoin d'une ame charitable pour comprendre une toute petite ligne de code ou du moin eclaircir ce point .Je decortique les codes source de OPENSSSL

    et je suis tomber sur ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    unsigned long ret=100;
     
    ret<<=8L;
    je pense si je me souviens bien de mes cours C que cette operation consiste a jouer sur les bits de poids les plus faible du type long est ce que je brule ou je refroidit carement.Une personne peut elle m'expliquer s'il le vous plais ou meme m'orienter vers liens .



    Merci par avance !

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ret<<=8L;
    //équivaut à :
    ret = ret << 8L;
    Après, théoriquement, '<<' est un décalage de bit, mais il est aussi possible qu'on ai effectué une surcharge de operator<<.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ce qui m'intrigue, c'est la présence du L.
    Quel intérêt de préciser que c'est un long ?

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par Neckara Voir le message
    [code]
    Après, théoriquement, '<<' est un décalage de bit, mais il est aussi possible qu'on ai effectué une surcharge de operator<<.
    Pas possible sur un type primitif. On ne peut surcharger des opérateurs que pour des classes.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Effectuer une surcharge de l'opérateur << entre long et long ? Félicitations !

    Sinon, 100 << 8 vaudra 100 * 2⁸ (un left shift de N équivaut à une multiplication par 2^N).

    Donc 100 << 8 == 25600

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 126
    Points : 58
    Points
    58
    Par défaut re
    merci a tous d'avoir pris le temps de repondre . Pour etre franc je suis aussi etonne que vous,
    meme si je suis pas un pro de la programation j'ai du mal a cerne l'utilite mais bon faut pas oublier que ce que je le tire des source de OPENSSSL , et c'est loins d'etre des nuls croyez moi je poste la fonction complète pour mieux y voir.


    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
    34
    35
    36
    37
    38
    39
    40
    41
     
     
     
    const unsigned char **pp, int *inf, long *rl, int max // parametre fonctions
     
     
    const unsigned char *p= *pp;
    	unsigned long ret=0;
    	unsigned int i;
     
    	if (max-- < 1) return(0);
    	if (*p == 0x80)
    		{
    		*inf=1;
    		ret=0;
    		p++;
    		}
    	else
    		{
    		*inf=0;
    		i= *p&0x7f;
    		if (*(p++) & 0x80)
    			{
    			if (i > sizeof(long))
    				return 0;
    			if (max-- == 0) return(0);
    			while (i-- > 0)
    				{
    				ret<<=8L;
    				ret|= *(p++);
    				if (max-- == 0) return(0);
    				}
    			}
    		else
    			ret=i;
    		}
    	if (ret > LONG_MAX)
    		return 0;
    	*pp=p;
    	*rl=(long)ret;
    	return(1);


    cela dit ekleog merci pour l'explication je suis rouyer visiblement car je ne me rapellait plus le principe de surcharge d'operator

  7. #7
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    La boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    			while (i-- > 0)
    				{
    				ret<<=8L;
    				ret|= *(p++);
    				if (max-- == 0) return(0);
    				}
    me semble être un calcul des N derniers octers.

    Disons que ret va voir ses bits décalés vers la gauche de 8 bits, ce qui va faire disparaître les bits les plus à gauche, et à droite vont "apparaître" les bits de *p.

    Après, tout ça est géré avec une variable i et une variable max, dont je pense qu'il sera difficile d'avoir la compréhension sans le contexte (p.ex., le nom de la fonction ?).

    Sinon, ton remerciement me semble indiquer que tu m'as mal compris : la surcharge d'opérateur entre long et long est impossible. Enfin, sinon, tu peux surtout remercier Davidbrcz !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 126
    Points : 58
    Points
    58
    Par défaut re
    oki en tout merci a tous j'ai pu me replonger dans le code et avec vos explication je vois un peu plus clair je vais insister jusque a conprendre completement merci encore

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    La fonction doit lire un long sur un nombre variable d'octets si je ne m'abuse. Le décalage de bit est là pour remettre chaque octet à sa place.
    Ceci dit, ce code ressemble plus à du (pas terrible) C et pas à du C++.

Discussions similaires

  1. Décalage de bits
    Par Kraz dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 21/10/2006, 18h09
  2. Multiplication par décalage de bits
    Par tekman54000 dans le forum Assembleur
    Réponses: 2
    Dernier message: 25/10/2005, 11h35
  3. Décalage de bit sur unsigned char [8]
    Par dboulange dans le forum C++
    Réponses: 14
    Dernier message: 26/07/2005, 14h10
  4. Comprendre un code asm relatif aux bitmaps
    Par sorry60 dans le forum Assembleur
    Réponses: 8
    Dernier message: 20/04/2005, 21h31
  5. Code de couleur en 16 bit
    Par Freakazoid dans le forum DirectX
    Réponses: 10
    Dernier message: 13/08/2003, 16h58

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