begin process at 2010 02 10 15:23:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > LE BINAIRE POUR LES NULS (EXPLICATIONS ET EXEMPLES)

LE BINAIRE POUR LES NULS (EXPLICATIONS ET EXEMPLES)


 Information sur la source

Note :
Aucune note
Catégorie :Tutoriaux Niveau :Débutant Date de création :25/09/2003 Vu / téléchargé :6 167 / 128

Auteur : 6Po

Ecrire un message privé
Site perso
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

Exemples et explications du fonctionnent binaire.

Le fichier ZIP contient la même chose que ce qui suit :

Source

  • <?
  • echo"
  • <table border='1' bordercolor='#000000' bordercolorlight='#000000' bordercolordark='#000000' cellspacing='0'>
  • <tr>
  • <td><b>2<sup>7</sup></b></td>
  • <td><b>2<sup>6</sup></b></td>
  • <td><b>2<sup>5</sup></b></td>
  • <td><b>2<sup>4</sup></b></td>
  • <td><b>2<sup>3</sup></b></td>
  • <td><b>2<sup>2</sup></b></td>
  • <td><b>2<sup>1</sup></b></td>
  • <td><b>2<sup>0</sup></b></td>
  • </tr>
  • <tr>
  • <td>128</td>
  • <td>64</td>
  • <td>32</td>
  • <td>16</td>
  • <td>8</td>
  • <td>4</td>
  • <td>2</td>
  • <td>1</td>
  • </tr>
  • <tr>
  • <td>1000 0000</td>
  • <td>0100 0000</td>
  • <td>0010 0000</td>
  • <td>0001 0000</td>
  • <td>0000 1000</td>
  • <td>0000 0100</td>
  • <td>0000 0010</td>
  • <td>0000 0001</td>
  • </tr>
  • </table>
  • <PRE>
  • Le nombre 5 = donc 4 + 1
  • 4 = 1 * 2<sup>2</sup> (0000 0100)
  • 1 = 1 * 2<sup>0</sup> (0000 0001)
  • 5 = donc 0000 0100 + 0000 0001 = 0000 0101
  • La fonction PHP base_convert(nombre, baseSource, baseCible)
  • permet de convertir un nombre dans une autre base.
  • Essai : Convertir le nombre 15 en base 2
  • <i>echo base_convert(15, 10, 2) ; </i> //Retournera donc 1111 pour 15 soit 8 + 4 + 2 + 1
  • Il existe 5 opérateurs de plus pour les bits
  • Il s'agit :
  • du ET &
  • du OU |
  • du NON ~
  • Le & retourne les bits allumés dans les 2 valeurs
  • 4 = 0000 0<b>1</b>00
  • 13 = 0000 1<b>1</b>01
  • --------------
  • 4 = 0000 0<b>1</b>00
  • Le | retourne les bits allumés dans l'une des 2 valeurs
  • 6 = 0000 0<b>1</b><b>1</b>0
  • 13 = 0000 <b>1</b><b>1</b>0<b>1</b>
  • --------------
  • 15 = 0000 <b>1111</b>
  • Le ~ inverse l'état des bits
  • ~17 = 000<b>1</b> 000<b>1</b>
  • ---------------
  • 238 = <b>111</b>0 <b>111</b>0
  • donc tous les 0 vont devenir des 1 et les 1 des 0
  • Il existe reste encore 2 opérateurs
  • Il s'agit :
  • du << décalage sur la droite
  • du >> décalage sur la gauche
  • 2 = 0000 00<b>1</b>0
  • ------------------
  • 2 << 1 = 0000 0<b>1</b>00 soit 4
  • On a ajouté un 0 depuis la fin en décalant les bits existant sur la gauche.
  • 2 = 0000 00<b>1</b>0
  • ------------------
  • 2 >> 1 = 0000 000<b>1</b>
  • Cette fois on a ajouté un 0 a gauche en décalant les bits sur la doite.
  • Il est bien sûr possible de décaler de plusieurs bits à la fois.
  • 2 = 0000 00<b>1</b>0
  • ------------------
  • 2 << 2 = 0000 <b>1</b>000 soit 8 (ajout de deux 0 par la droite)
  • 2 = 0000 00<b>1</b>0
  • ------------------
  • 2 >> 2 = 0000 0000 soit 0 (ajout de deux 0 par la gauche)
  • x << n = x * 2<sup>n</sup>
  • 5 << 1 = 5 * 2<sup>1</sup> = 5 * 2 = 10
  • 5 << 2 = 5 * 2<sup>2</sup> = 5 * 4 = 20
  • x >> n = x / 2<sup>n</sup> (division sans virgule)
  • 8 >> 1 = 8 / 2<sup>1</sup> = 8 / 2 = 4
  • 8 >> 2 = 8 / 2<sup>2</sup> = 8 / 4 = 2
  • 5 >> 1 = 5 / 2<sup>1</sup> = 5 / 2 = 2 (2.5 arrondi a l'entier au inférieur)
  • J'ai remarqué que PHP n'était pas capable de faire le test suivant :
  • if (4 & 13 == 4)
  • pour contouner le problème il faut utlisé des variables.
  • $c = 4 & 13 ;
  • if ($c == 4)
  • Quel peut être l'avantage d'utiliser des bits comme ceci ?
  • Je vais prendre mon exemple :
  • Je voulais faire une page d'administration mais je voulais donner des privilèges selon le rang.
  • Visiteur, utilisateur ou administrateur
  • <b>Le visiteur peut :</b>
  • Lire des news - valeur 1
  • Il aura donc le droit <b>1</b>
  • <b>L'utilisateur peut :</b>
  • Lire des news - valeur 1
  • Ajouter des news - valeur 2
  • Il aura donc le droit <b>3</b>
  • <b>L'administrateur peut :</b>
  • Lire des news - valeur 1
  • Ajouter des news - valeur 2
  • Modifier des news - valeur 4
  • Effacer des news - valeur 8
  • Il aura donc le droit <b>15</b>
  • Selon ce principe je peux ajouter un nouveau rang facilement.
  • Par exemple en créant un <b>Modérateur</b> qui pourrait
  • Lire des news - valeur 1
  • Ajouter des news - valeur 2
  • Effacer des news - valeur 8
  • Soit le droit <b>11</b>
  • J'espère que cette petite aide pourra aider quelqu'un.
  • Par 6po - 6po@netplus.ch
  • </PRE>
  • ";
  • ?>
<?
echo"
<table border='1' bordercolor='#000000' bordercolorlight='#000000' bordercolordark='#000000' cellspacing='0'>
  <tr>
    <td><b>2<sup>7</sup></b></td>
    <td><b>2<sup>6</sup></b></td>
    <td><b>2<sup>5</sup></b></td>
    <td><b>2<sup>4</sup></b></td>
    <td><b>2<sup>3</sup></b></td>
    <td><b>2<sup>2</sup></b></td>
    <td><b>2<sup>1</sup></b></td>
    <td><b>2<sup>0</sup></b></td>
  </tr>
  <tr>
    <td>128</td>
    <td>64</td>
    <td>32</td>
    <td>16</td>
    <td>8</td>
    <td>4</td>
    <td>2</td>
    <td>1</td>
  </tr>
  <tr>
    <td>1000 0000</td>
    <td>0100 0000</td>
    <td>0010 0000</td>
    <td>0001 0000</td>
    <td>0000 1000</td>
    <td>0000 0100</td>
    <td>0000 0010</td>
    <td>0000 0001</td>
  </tr>
</table>

<PRE>
Le nombre 5 = donc 4 + 1
4 = 1 * 2<sup>2</sup> (0000 0100)
1 = 1 * 2<sup>0</sup> (0000 0001)
5 = donc 0000 0100 + 0000 0001 = 0000 0101

La fonction PHP base_convert(nombre, baseSource, baseCible) 
permet de convertir un nombre dans une autre base.

Essai : Convertir le nombre 15 en base 2
<i>echo base_convert(15, 10, 2) ; </i> //Retournera donc 1111 pour 15 soit 8 + 4 + 2 + 1
Il existe 5 opérateurs de plus pour les bits

Il s'agit :
du ET &
du OU |
du NON ~

Le & retourne les bits allumés dans les 2 valeurs
4  = 0000 0<b>1</b>00
13 = 0000 1<b>1</b>01
--------------
4  = 0000 0<b>1</b>00

Le | retourne les bits allumés dans l'une des 2 valeurs
6  = 0000 0<b>1</b><b>1</b>0
13 = 0000 <b>1</b><b>1</b>0<b>1</b>
--------------
15 = 0000 <b>1111</b>

Le ~ inverse l'état des bits
~17 = 000<b>1</b> 000<b>1</b>
---------------
238 = <b>111</b>0 <b>111</b>0
donc tous les 0 vont devenir des 1 et les 1 des 0

Il existe reste encore 2 opérateurs

Il s'agit :
du << décalage sur la droite
du >> décalage sur la gauche

2      = 0000 00<b>1</b>0
------------------
2 << 1 = 0000 0<b>1</b>00 soit 4 
On a ajouté un 0 depuis la fin en décalant les bits existant sur la gauche.

2      = 0000 00<b>1</b>0
------------------
2 >> 1 = 0000 000<b>1</b>
Cette fois on a ajouté un 0 a gauche en décalant les bits sur la doite.

Il est bien sûr possible de décaler de plusieurs bits à la fois.
2      = 0000 00<b>1</b>0
------------------
2 << 2 = 0000 <b>1</b>000 soit 8 (ajout de deux 0 par la droite)

2      = 0000 00<b>1</b>0
------------------
2 >> 2 = 0000 0000 soit 0 (ajout de deux 0 par la gauche)


x << n = x * 2<sup>n</sup>
5 << 1 = 5 * 2<sup>1</sup> = 5 * 2 = 10
5 << 2 = 5 * 2<sup>2</sup> = 5 * 4 = 20

x >> n = x / 2<sup>n</sup> (division sans virgule)
8 >> 1 = 8 / 2<sup>1</sup> = 8 / 2 = 4
8 >> 2 = 8 / 2<sup>2</sup> = 8 / 4 = 2
5 >> 1 = 5 / 2<sup>1</sup> = 5 / 2 = 2 (2.5 arrondi a l'entier au inférieur)

J'ai remarqué que PHP n'était pas capable de faire le test suivant :


if (4 & 13 == 4)

pour contouner le problème il faut utlisé des variables.

$c = 4 & 13 ;
if ($c == 4)



Quel peut être l'avantage d'utiliser des bits comme ceci ?
Je vais prendre mon exemple :

Je voulais faire une page d'administration mais je voulais donner des privilèges selon le rang.
Visiteur, utilisateur ou administrateur

<b>Le visiteur peut :</b>
Lire des news  - valeur 1
Il aura donc le droit <b>1</b>

<b>L'utilisateur peut :</b>
Lire des news  - valeur 1
Ajouter des news  - valeur 2
Il aura donc le droit <b>3</b>

<b>L'administrateur peut :</b>
Lire des news  - valeur 1
Ajouter des news  - valeur 2
Modifier des news - valeur 4
Effacer des news - valeur 8
Il aura donc le droit <b>15</b>

Selon ce principe je peux ajouter un nouveau rang facilement.
Par exemple en créant un <b>Modérateur</b> qui pourrait 
Lire des news  - valeur 1
Ajouter des news  - valeur 2
Effacer des news - valeur 8
Soit le droit <b>11</b>



J'espère que cette petite aide pourra aider quelqu'un.
Par 6po - 6po@netplus.ch
</PRE>
";
?>


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

Source avec Zip EXEMPLE DE CRÉATION D'UN SCRIPT D'AUTHENTIFICATION par phpAnonyme
Source avec Zip Source avec une capture N/X API: GOOGLE MAPS DEPUIS PHP VALID W3C par GillesWebmaster
PHP EXTRAIRE DES MAILS D'UN GROS FICHIER LOCAL OU DISTANT par cosmoswarezone1
FORMULAIRE PHP + VERIFICATION + ENVOI DU MAIL par cosmoswarezone1
Source avec Zip Source avec une capture CODE BARE!!! par toutoos

Commentaires et avis

Commentaire de eax le 25/09/2003 07:39:21

ça a l'air sympa tout ça

Commentaire de ceacy le 26/09/2003 19:24:16

Ouais ... ça va me faire de la lecture ;-)

Commentaire de defkrie le 26/09/2003 22:38:25

Bravo et merci pour ta contribution

Commentaire de LocalStone le 28/09/2003 17:44:56

Excellente idée. Et en plus, ça me rappelle mes cours de MPI. 9/10 !

Commentaire de 6Po le 28/09/2003 19:45:12

Merci à tous, ca fait plaisir.

Je profite pour dire que j'ai trouvé le petit problème avec le test :)

Rappel selon ma source :
if (4 & 13 == 4)

pour contouner le problème il faut utlisé des variables.

$c = 4 & 13 ;
if ($c == 4)

Pour effectuer ce test sans variable intermédiaire il faut faire
if ((4 & 13) == 4)
il faut forcé le 4 & 13 avec des ( ), je comprends pas vraiment pourquoi PHP fait le test avant d'effecter l'opération... donc en la forcant de cette facon on résoud ce petit soucis.

Commentaire de olid le 30/09/2003 21:30:01

Au contraire, PHP reagit correctement par rapport aux conventions...

Les opérateurs de comparaison sont prioritaires sur les tests associatifs par bits

Quand tu fais "if (4 & 13 == 4)", c'est comme ci tu faisais "if (4 & (13 == 4))" qui est équivalent à "if (4 & 0)" !!!

:o|

Commentaire de 6Po le 30/09/2003 21:43:14

Je confirme ca marche pas :)

T'as testé avant de posé ton message olid ? Moi aussi je peux dire plein de truc, bien sur que ca devrait etre effectuer avant mais ca marche pas en tout cas ca marche pas avec Easyphp 1.6.0.0 et php 4.2.0.0

Commentaire de olid le 30/09/2003 22:34:30

Mon commentaire se basait sur le "PHP 4.0 Manuel de Référence" traduction française de celle du "PHP Documentation Group" qui est distribué sur Nexen... Aurais-je mal compris les lignes ci-dessous ? :o|

7.7.3 Opérateurs sur les bits
Les opérateurs sur les bits vous permettent de manipuler les bits dans un entier.

$a & $b, ET (AND), Les bits positionnés à 1 dans $a ET dans $b sont
positionnés à 1.

...

7.7.4 Opérateurs de comparaison
Les opérateurs de comparaison, comme leur nom l'indique, vous permettent de comparer deux valeurs.

$a == $b,Egal, Vrai si $a est égal à $b.

...

7.7.8 Les opérateurs logiques
$a and $b, ET (And), Vrai si $a ET $b sont vrais.

La raison pour laquelle il existe deux types de "ET" et de "OU" est qu'ils ont des priorités différentes. Voir le paragraphe précédence d'opérateurs.

...

7.7.9 La précédence des opérateurs

ASSOCIATIVITé, OPERATEUR(S)
...
gauche, and
...
gauche, &
non&#8722;associative, == != ===


Et zà marche pô car ta syntaxe etait mauvaise :o|

Commentaire de 6Po le 01/10/2003 12:42:30

Oauis c'est écrit dans la FAQ mais ce systeme n'a aucun sens...

En c, cobol ou meme en vb ca se fait pas comme ca :)

A voir je suis pas le seul a trouver ca louche :)

NOTE DEPUIS PHP.ORG FAQ
====================
28-Aug-2002 02:43
It should be noted that PHP's ?: operator associates left to right.  In C and in C++, the ?: operator associates right to left.  Thus:

1 ? 2 : 3 ? 4 : 5;

has the value 4 in PHP and the value 2 in C and in C++.  I find it curious that they would reverse the associativity of an operator from its "accepted" sense, but yet they didn't fix the precedence of the bitwise operators.  Thus:

if(A & 7 == 5)

groups like:

if(A & (7 == 5))

It is a trap for the unlucky.

Commentaire de olid le 01/10/2003 13:15:52

Eh bin moà, je trouve celà normal et logique...

Le fait que les == (et autres) soient non-associative justifie que le test "7 == 5" ait lieu avant toutes les autres operations associative quelles soient à gauche ou à droite...
Et c'est meme trés pratique quand tu as plusieur tests "&" ou "and" avec des sous-test "==", car si un soustest est faux alors les soustest suivant ne seront pô interprétés par le langage, d'où un gain de performances.

Za fait plusieurs année quon m'a appris çà et que je l'ai appliqué dans tout les langages que jai connus...
Et si certain langage permettent ta manip (je conteste pô, jai jamais essayé), c'est pô vraiment une bonne chose car çà nous met dans la confusion et rend les sources difficiles à porter...

Je te conseille vivement de prendre l'habitude de grouper tes tests associatif... Et cest une bonne chose que le PHP n'accepte pô ce péché d'usage ;op

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,016 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales