<?
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>
";
?>