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 :

<< symbole en C


Sujet :

C

  1. #1
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut << symbole en C
    Bonjour,
    Je ne comprend pas bien cette ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    static GLfixed vertices[] ={-80 << 16,	-160 << 16,
    								0 << 16,	160 << 16,
    								80 << 16,	-160 << 16,
    								-80 << 16,	-160 << 16,
    								0 << 16,	160 << 16,
    								80 << 16,	-160 << 16};
    Quelqu'un pourrait-il m'expliquer le but de << ?
    Merci

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 32
    Points
    32
    Par défaut
    Je pense qu'il s'agit de ceci:

    << effectue un décalage à gauche du nombre de positions précisées
    >> effectue un décalage à droite du nombre de positions précisées
    <<= effectue un décalage à gauche du nombre de positions précisées et assigne le résultat à la première opérande
    >>= effectue un décalage à droite du nombre de positions précisées et assigne le résultat à la première opérande

  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
    par décalage, on entend décalage binaire.

    par exemple:
    décimal : 12
    binaire: 00001100

    si on décale 12 de 2 vers la gauche, on se retrouve avec en binaire 00110000 cad 48
    on a donc fait une multiplication par 4 cad 2 puissance 2

    en gros un décalage binaire de n vers la gauche correspond à une multiplication par 2 puissance n

    Reprenez moi si je me trompe, mais je crois que c'est ça.
    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
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    ok merci. Mais ca sert a quoi au juste ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 63
    Points : 60
    Points
    60
    Par défaut
    Ca te sert à faire des multiplications et divisions, pas cher du tout.
    Tres utile, mais à utiliser avec precaution.
    Birds of a feather flock together

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 32
    Points
    32
    Par défaut Re: << symbole en C
    Citation Envoyé par graphicsxp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    static GLfixed vertices[] ={-80 << 16,	-160 << 16,
    					  0 << 16,	160 << 16,
    					80 << 16,	-160 << 16,
    					-80 << 16,	-160 << 16,
    					0 << 16,	160 << 16,
    					80 << 16,	-160 << 16};

    A quoi sert l'entierté du code auxquels tu a pris celui-ci ca aidera peut-etre pour l'explication.

  7. #7
    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 Re: << symbole en C
    Citation Envoyé par lipczynski
    A quoi sert l'entierté du code auxquels tu a pris celui-ci ca aidera peut-etre pour l'explication.
    Gnn ?
    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

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 32
    Points
    32
    Par défaut Re: << symbole en C
    Citation Envoyé par ggnore
    Gnn ?
    Ben ouais quoi , pour lui expliquer pourquoi il était plus judicieux d'utiliser les "<<" à une multiplication simple avec un "*".

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut Re: << symbole en C
    Citation Envoyé par lipczynski
    Citation Envoyé par ggnore
    Gnn ?
    Ben ouais quoi , pour lui expliquer pourquoi il était plus judicieux d'utiliser les "<<" à une multiplication simple avec un "*".
    Je pense que "l'entierté" l'a un peu choqué ... tu devrais peut-être reposer ta question avec "intégralité"
    - Je suis fascine par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre....Et les avions aussi....
    - Si tu travailles avec un marteau-piqueur pendant un tremblement de terre, désynchronise-toi, sinon tu travailles pour rien.
    JC Vandamme.

  10. #10
    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
    A vue de nez, son code a l'air de faire de la 3D.

    Les décalages binaires c'est plus rapides que les multiplications/divisions. Dans un moteur graphique, tout gain de vitesse est à conserver.
    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

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 32
    Points
    32
    Par défaut
    vu comme ca c'est clair.




    Citation Envoyé par ggnore
    Dans un moteur graphique, tout gain de vitesse est à conserver.
    En général, je dirais que pout tout programme tout gain de vitesse est bon.

  12. #12
    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
    ô que c'est bô.

    Il y a un compromis à faire de temps en temps.

    Si tu veux que ton code soit facilement modifiable par tout le monde (cad aussi les débutants), il faut éviter de faire du code obscur. Tu vas pas te faire chi** à optimiser un traitement de fichier texte banal sous prétexte que ton éthique te dit que plus ça va vite, mieux c'est. Si ton traitement de fichier texte marche bien, c'est l'essentiel
    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

  13. #13
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    et oui mon code fait de la 3D...
    en fait j'ai deux versions de declarations de tableaux de points dans l'espace 3D. Une version avec des floats que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    static GLfloat vertices[] = {-40, -80,
    								0, 80,
    								40, -80,
    								-40, -80,
    								0, 80,
    								40, -80};
    et une version avec des entiers fixes que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    	static GLfixed vertices[] ={-80 << 16,	-160 << 16,
    								0 << 16,	160 << 16,
    								80 << 16,	-160 << 16,
    								-80 << 16,	-160 << 16,
    								0 << 16,	160 << 16,
    								80 << 16,	-160 << 16};
    Et je ne comprends pas l'interet de multiplier par 2^16....

  14. #14
    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 ne suis pas sûr que fixed signifie entier fixe.

    Je crois que j'ai déjà vu une référence à fixed en ce qui concerne les angles.
    Ici, on peut voir que cela fait référence à des vecteurs ou quelquechose dans le genre.

    Admettons qu'on ait un repère orthonormé x;y basique.

    On est d'accord qu'un vecteur qui fait (1;1) va dans la même direction qu'un autre qui fait (2;2)

    Je dirais que c'est 'à peu près' le même principe pour tes 2 façons de faire. Quand on utilise des fixed, on a effectivement des entiers, mais on n'aura pas la même précision que les float si on reste avec des petites valeurs car les entiers n'ont pas de virgules (si je vous jure !)

    Donc on prend des valeurs super grandes comme ça, on peut appliquer dse modifications dessus sans perdre d'information.

    C'est sûrement pas très bien expliqué
    Edit: évident que c'est vaseux ce que je raconte
    et pas sûr du tout que ça soit correct
    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

  15. #15
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    pfiou, alors la
    merci bcp, c effectivement une raison tres plausible ! tout est clair maintenant

  16. #16
    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
    de rien du tout. C'est un peu du bol.

    Tant que tu y es, clique sur résolu si juges avoir eu ta réponse
    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

  17. #17
    Membre régulier Avatar de kaisse
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 100
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par graphicsxp
    et oui mon code fait de la 3D...
    en fait j'ai deux versions de declarations de tableaux de points dans l'espace 3D. Une version avec des floats que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    static GLfloat vertices[] = {-40, -80,
    								0, 80,
    								40, -80,
    								-40, -80,
    								0, 80,
    								40, -80};
    et une version avec des entiers fixes que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    	static GLfixed vertices[] ={-80 << 16,	-160 << 16,
    								0 << 16,	160 << 16,
    								80 << 16,	-160 << 16,
    								-80 << 16,	-160 << 16,
    								0 << 16,	160 << 16,
    								80 << 16,	-160 << 16};

    Et je ne comprends pas l'interet de multiplier par 2^16....
    Je crois comprendre pourquoi. Disons qu'a la base, il utilise des float, ca veut donc dire que tes nombres font pouvoir prendre des valeurs non-entieres.
    La deuxieme methode se fait avec des GLFixed.

    Voici mon interpretation:
    un nombre flottant a une virgule flottante (d'où son nom) dont la position est précisé par l'exposant du nombre. Lequel exposant est stocké dans la représentation du nombre (8 bits pour un float, 11 pour un double, plus de détails là: http://www.haypocalc.com/maths/ieee754_854.php).
    Donc du coup, ca laisse un petit peu moins de places pour stocker le reste du nombre (le "signe" et la "mantisse").

    Ce que semblent representés tes GLFixed sont en fait des nombres flottants dont l'exposant est fixé (donc ce n'est plus des entiers). Ca permet de gagner de précieux bits de représentations du nombre, cependant, comme c'est fixé, ca perd en souplesse. Et pour representer celà, il utilise donc des entiers, et le décalage de 16 bits indique qu"il utilise l'exposant -16. En gros un GLFixed codé 55 (par exemple) representera en fait la valeur 55 * 2^(-16). Pour obtenir vraiment 55 il faut stocker 55 << 16. Tu stockes donc des nombres décimaux avec une précision figée de 2^(-16).

    Ton programme suppose donc que tes nombres ne vont pas etre trop grand ni trop petits, et qu'une perte de 2^(-16) n'est pas grave, et il va
    ainsi stocker les nombres décimaux dans des entiers. Celà lui permet de gagner en rapidité (l'arithmétique des flottants, avec mantisse + exposant, est assez longue comparée à l'arithmétique sur les entiers).

    Donc selon moi tes GLFixed sont des entiers (int ou long).

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par lipczynski
    vu comme ca c'est clair.
    Citation Envoyé par ggnore
    Dans un moteur graphique, tout gain de vitesse est à conserver.
    En général, je dirais que pout tout programme tout gain de vitesse est bon.
    Vu que ce sont des constantes évaluées à la compilation, je ne vois pas ce que ça change...
    Pas de Wi-Fi à la maison : CPL

  19. #19
    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
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par lipczynski
    vu comme ca c'est clair.
    Citation Envoyé par ggnore
    Dans un moteur graphique, tout gain de vitesse est à conserver.
    En général, je dirais que pout tout programme tout gain de vitesse est bon.
    Vu que ce sont des constantes évaluées à la compilation, je ne vois pas ce que ça change...
    ok, mais ...

    Quel est l'intérêt du décalage binaire par rapport à une multiplication pure et simple alors ?
    Peut être que c'est pour se donner un style de hard core coder ?
    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

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ggnore
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par lipczynski
    vu comme ca c'est clair.
    Citation Envoyé par ggnore
    Dans un moteur graphique, tout gain de vitesse est à conserver.
    En général, je dirais que pout tout programme tout gain de vitesse est bon.
    Vu que ce sont des constantes évaluées à la compilation, je ne vois pas ce que ça change...
    ok, mais ...

    Quel est l'intérêt du décalage binaire par rapport à une multiplication pure et simple alors ?
    Peut être que c'est pour se donner un style de hard core coder ?
    Pour des expressions constantes, on peut parfois dire ça. Pour des expressions évaluées à l'exécution, ça améliore le code, bien que dans bien des cas, le compilateur soit capable de reconnaitre une puissance de 2 et emplace la multiplication par un décalage. Mais dans le doute, il vaut mieux clarifier ses intentions.

    Ca peut être aussi intentionnel, car ça correspond exactement à ce qu'on veut faire (manipulations de bits par exemple).

    http://emmanuel-delahaye.developpez..../ed/inc/BITS.H
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Code ASCII du symbole Euro
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/04/2007, 01h27
  2. [Flash Mx 2004] - Supprimer un symbole
    Par alucard dans le forum Flash
    Réponses: 4
    Dernier message: 05/01/2004, 16h03
  3. Organigramme d'un algorithme, convention de symboles
    Par rstephane dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 12/06/2003, 17h47
  4. [Sybase] Définition des symboles
    Par SoaB dans le forum Sybase
    Réponses: 5
    Dernier message: 19/03/2003, 23h06
  5. symbole ##
    Par JEG dans le forum C
    Réponses: 2
    Dernier message: 23/01/2003, 19h15

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