Le binaire pour les nuls (explications et exemples)

Description

Exemples et explications du fonctionnent binaire.

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

Source / Exemple :


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

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.