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

EDI, CMS, Outils, Scripts et API PHP Discussion :

[Configuration] Opération arithmétique


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Fabouney
    Invité(e)
    Par défaut [Configuration] Opération arithmétique
    Bonjour à tous et à toute.

    Ma requête est simple:
    y-aurait-il une âme charitable pour m'expliquer ce bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $date = (int)$date; // 131532317
    $year=$date>>16;
    $month = ($date>>8 ) & 0xFF;
    $day = $date & 0xFF;
     
    echo "$year-$month-$day"; //2007 6 29
    Surtout m'expliquer pourquoi un décalage à droite de 16 (je pense que c parceque l'année et sur 4 octect donc 16 bits et le mois et le jours sur 8 bits)
    mais ce n'est pas très clair et surtout l'opéraition ($date>>8 ) & 0xFF; le 0xFF c'est vraiment pas très clair.

    Merci pour vos réponse, j'aimerais bien comprendre.

    Coridalement.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Salut,

    0xFF est l'écriture hexadécimale pour le nombre 255.
    & est l'opérateur "et binaire" (cf http://fr2.php.net/manual/fr/languag...rs.bitwise.php)

    L'opération ($date >> 8) & 0xFF effectue un décalage de 1 octets (8 bits), puis récupere uniquement l'octet de poids faible. En d'autres terme, elle prend le 2é octet en partant des poids faibles.
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  3. #3
    Fabouney
    Invité(e)
    Par défaut
    C'est toujours pas très clair lol mais bon c'est pas grave :$

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    C'est quoi que tu comprends pas ? ^^
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  5. #5
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Apparemment ta date a été codée sur deux octets je vais essayer d'expliquer mais je promets rien.

    Ta date en décimal vaut 131532317
    ce qui en hexadécimal donne : 07D7061D
    Maintenant chaque caractère hexa est codé en binaire sur 4 bits! On a donc décidé que l'année devait être sur 2 octets (16bits) :
    on récupère l'année en décalant de 16 bits a droite (pour garder les 16 bits de gauche). Ca revient a prendre 07D7061D et décaler a droite de 4 lettres (chaque lettre vaut 4 bits) = > 000007D7
    Maintenant ca c'est de l'hexadecimal donc en décimal ca donne 2007
    Voilà l'année

    Pour le mois on a décidé qu'elle était sur 8 bits a coté de l'année, on décale donc seulement de 8 bits a droite (on obtient donc) 0007D706. Comme on sait que 07D7 correspond a l'année on va faire un & binaire avec juste 0xFF (ca revient a dire je prends 0007D706 je fais un & avec 000000FF et ca donne 00000006 (en gros tu récupères juste les 8 derniers bits).
    00000006 en hexa donne 6 en décimal

    Tu refais ensuite un & avec toute la valeur hexa (comme dit avant tu récupères les 8 derniers bits) et ca te donner 1D en hexa soit 29 en décimal.

    J'espère avoir été a peu pres clair ^^

    Pour partir de la date et obtenir le nombre décimal du début tu fais ca :

    $dateInt = (int)("2007"."06"."29");

  6. #6
    Fabouney
    Invité(e)
    Par défaut
    Merci beaucoup c'est beaucoup plus clair.
    Et dans quel cas c'est vraiment utile d'utiliser les opérations arytmétique comme cela, car OK c'est vrai que c'est super pratique et rapide.

    Cordialement.

  7. #7
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Quand tu stockes la date en mémoire en chaine de caractères, dans ton cas ca prendra en mémoire 8 caractères et chaque caractère vaut un certain nombre de bits (ca dépend des systemes) mais admettons que chaque caractère soit codé sur 8 bits, pour stocker une date tu as donc besoin de 64bits au lieu des 32 bits de l'entier donc tu prends deux fois moins de place pour stocker la meme chose.
    Donc dans des sytemes embarqués a faible mémoire c'est tres important d'économiser la place de cette manière.

  8. #8
    Fabouney
    Invité(e)
    Par défaut
    Je vois tout à fait oui en effet, meme si maintenant les serveurs ont des config de malade, sur des base de données volumineuse il est toujours important de stocker le plus d'information possible dans le moin de bits possible.

    En tout cas merci d'avoir pris le temp de me répondre.
    Cordialement.

Discussions similaires

  1. Réponses: 11
    Dernier message: 24/09/2007, 19h51
  2. Opération arithmétique dans un select
    Par Christophe Charron dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/03/2007, 11h19
  3. Réponses: 5
    Dernier message: 17/06/2006, 12h33
  4. Opération arithmétique de String à Float
    Par Shiryu57 dans le forum Langage
    Réponses: 4
    Dernier message: 13/03/2006, 10h22
  5. [VAL] Opérations arithmétiques
    Par WriteLN dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/05/2005, 09h59

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