Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LE BINAIRE POUR LES NULS (EXPLICATIONS ET EXEMPLES)


Information sur la source

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

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de eax le 25/09/2003 07:39:21

ça a l'air sympa tout ça

signaler à un administrateur
Commentaire de ceacy le 26/09/2003 19:24:16

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

signaler à un administrateur
Commentaire de defkrie le 26/09/2003 22:38:25

Bravo et merci pour ta contribution

signaler à un administrateur
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 !

signaler à un administrateur
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.

signaler à un administrateur
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|

signaler à un administrateur
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

signaler à un administrateur
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|

signaler à un administrateur
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.

signaler à un administrateur
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...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,203 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.