Le binaire pour les nuls (explications et exemples)

Soyez le premier à donner votre avis sur cette source.

Vue 11 270 fois - Téléchargée 204 fois

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

Ajouter un commentaire

Commentaires

Messages postés
296
Date d'inscription
lundi 2 septembre 2002
Statut
Membre
Dernière intervention
28 janvier 2008

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
Messages postés
105
Date d'inscription
jeudi 16 mai 2002
Statut
Membre
Dernière intervention
22 janvier 2009

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.
Messages postés
296
Date d'inscription
lundi 2 septembre 2002
Statut
Membre
Dernière intervention
28 janvier 2008

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−associative, == != ===


Et zà marche pô car ta syntaxe etait mauvaise :o|
Messages postés
105
Date d'inscription
jeudi 16 mai 2002
Statut
Membre
Dernière intervention
22 janvier 2009

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
Messages postés
296
Date d'inscription
lundi 2 septembre 2002
Statut
Membre
Dernière intervention
28 janvier 2008

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|
Afficher les 10 commentaires

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.