Précédent   Forum des professionnels en informatique > PHP > Outils
Outils Forum d'entraide sur les outils pour développeurs PHP : EDI, installation, administration... Avant de poster : FAQ outils, toutes les FAQ PHP et les comparatifs
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/07/2007, 14h59   #1
Fabouney
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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 :
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.
  Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 15h14   #2
Membre chevronné
 
Inscription : mai 2005
Messages : 657
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 657
Points : 722
Points : 722
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.
Taum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 15h24   #3
Fabouney
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
C'est toujours pas très clair lol mais bon c'est pas grave :$
  Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 15h25   #4
Membre chevronné
 
Inscription : mai 2005
Messages : 657
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 657
Points : 722
Points : 722
C'est quoi que tu comprends pas ? ^^
Taum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 15h33   #5
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
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");
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 15h58   #6
Fabouney
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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.
  Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 17h16   #7
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
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.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 18h54   #8
Fabouney
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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.
  Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h44.


 
 
 
 
Partenaires

Hébergement Web