Editorial
Bienvenue sur Le CBNA!
Nous accueillons avec plaisir vos yeux sur nos pages, sur la section GameMaker du CBNA!
Si vous êtes ici, c'est en théorie car vous avez envie de créer un jeu video, ou bien vous cherchez de l'aide, ou encore vous désirez philosopher avec les membres dans la Section Spirituelle, ou vous êtes un artiste et désirez partager vos oeuvres dans la Section CBN'Art.
Bon, il est tout aussi possible nous vous l'accordons que vous soyez tombé ici par hasard, mais ce n'est pas grave nous vous accueillons!
Notre But aujourd'hui est de promouvoir la programmation en France, avec GameMaker entre autre, ou plutôt de partager nos connaissances en programmation, nos techniques, et aussi de nous enrichir, de vous enrichir et d'enrichir le contenu du site avec vos créations et vos conseils.
Nous proposons des Tutoriels, des gm6 et gmd (Codes sources), des scripts, des DLL, des Librairies... Tous créés par des utilisateurs de GameMaker prêts à vous aider.
Aussi ces utilisateurs publient leurs jeux sur le site pour se faire connaître et pour faire avancer la communauté.
Vous êtes certainement comme eux, puisque "eux" c'est vous! Oui, vous qui lisez ces mots, vous pouvez dès maintenant envoyer vos jeux, vos Scripts, vos Tutoriels, vos gm6 et gmd, vos DLL, vos Librairies ou même dans la Section Spirituelle ou dans la Section CBN'Art nous faire part de vos textes, images, états d'esprits, vos opinions sur les Evènements actuels...
Aussi Le CBNA ce n'est pas que du travail, c'est aussi un espace de détente, de rire, de plaisir... nous vous invitons donc à venir parler sur le forum, participer à sa vie, à ses activités...

Merci à vous d'avoir pris le temps de lire ces quelques lignes...

News
Les opérateurs binaires
Les opérateurs binaires

Somaire
1- Introduction aux opérateurs binaires
2- Bases et conversion (facultatif)
3- Calculs avec les opérateurs binaires
4- Regles binaires
5- Opérateurs de décalage << et >>
6- Opérateur de complément ~
7- Le systeme héxadécimal
8- Utilité de ces opérateurs

Ce tutoriel auras pour but d'expliquer le fonctionnement des opérateurs binaires (bitwise), qui sont croyez moi très utiles bien qu'assez obscur au premier abort. La partie 8 est la partie la plus interressante car elle montre leurs utilité.


1- Introduction aux opérateurs binaires

Il existe en tout 6 opérateurs binaires :
-Le et (and) noté &
-Le ou inclusif (or) noté |
-Le ou exclusif (xor) noté ^
-Le décalage a droite >>
-Le décalage a gauche <<
-L'opérateur de complément ~

Les trois premiers opérateurs se présentent sous trois formes, avec une forme qui permettra de calculer avec des nombres, et une autre calculer des bits entre eux.
-Le et peut s'écrire : & , && , and
-Le ou inclusif peut s'écrire : | , || , or
-Le ou exclusif peut s'écrire : ^ , ^^ , xor

Un bit peut avoir seulement deux valeurs (étant de base 2), 0 ou 1.
En fait physiquement cela correspond a la polarisation en spin d'un électron (spin down ou spin up).
En programmation 1 et 0 correspondent a vrai et faux.

Les opérateurs binaires sont des opérateurs logiques :
Par exemple si on vous dit qu'une information est vraie et qu'une autre information l'est aussi, on pourras considérer que l'information totale est vraie. Or si une des deux informations est erronnée, l'information globale seras alors elle aussi erronnée.
C'est tout simplement comme ça que fonctionne l'opérateur and.

Si on remplace vrai par 1 et faux par 0, on a alors :
1 and 1 = 1
1 and 0 = 0, de même 0 and 1 = 0
0 and 0 = 0
Voila donc le fonctionnement du and.
J'avais dit précédement que and, && et & n'avaient pas tous la même utilitée.
En fait le && est la vrai syntaxe en programmation du and, donc ils s'utilisent de la même manière, mais ne servent eux qu'a comparer seulement deux bits entre eux.
Le & lui sert à comparer quand à lui deux nombres entre eux.

Pour comparer deux nombres entre eux il faut tout d'abord les ecrire en base 2, s'ils sont en base 10.
Nous fonctionnons (nous les humains) en base 10, certainement car nous possédons dix doigts, mais les machines elles fonctionnent en base 2 (voir Spintronique pour savoir pourquoi).


2- Bases et conversion (facultatif)

Cette partie est facultative puisque la conversion base 10 <=> base 2 peut se faire avec la calculatrice de Windows bien que rien ne vous empeche d'apprendre ce mécanisme si vous ne savez pas déja le faire.

Nous possédons donc 10 chiffres permettant d'ecrire tous nos nombres :
0, 1, 2, 3, 4, 5, 6, 7, 8, et 9.
Pour la base de 2 on a juste 0 et 1.

Exemple de nombres en base 10 puis en base 2 :
666 <=> 1010011010
23 <=> 10111
13 <=> 1101
2012 <=> 11111011100

a) Conversion base 2 vers base 10

Pour convertir un nombre de base 2 en un nombre de base 10 rien de plus simple, il suffit en partant de la droite multiplier chaque chiffre par 2 puissance sa position.
Exemple, avec ^ signifiant puissance et pas xor, et * signifiant multiplier :
10111 base 2 = 1*2^0 + 1*2^1 + 1*2^2 + 0*2^3 + 1*2^4 = 1 + 2 + 4 + 0 + 16 = 23

b) Conversion base 10 vers base 2

Pour passer de la base 2 à la base 10 c'est un peu plus compliqué.
Une méthode simple consiste a imaginer notre nombre de base 10 sous forme de billes par exemple, puis d'imaginer des boites pouvant contenir un certain nombre de billes. Nos boite seront classées de cette manière, dans un ordre decroissant du nombre de billes qu'elles peuvet contenir.
Si on a 123 à covertir en base 2, il suffit de ce dire que l'on possède 123 billes.
Ensuite il faut chercher une puissance de 2 suppérieure a notre nombre de billes.
Ici pour 123 on auras donc 2^7 = 128
Nos boites sont donc disposées de cette maniere (les [] signifient boite et le nombre a l'interieur est le nombre de bille que peut contenir la boite, de plus on commence à 2^(7-1) soit 2^6 ) :
[2^6] [2^5] [2^4 ] [2^3] [2^2] [2^1] [2^0] soit
[64] [32] [16] [8] [4] [2] [1]
Maintenant nous allons remplir nos boites de billes avec une regle simple, il faut remplir entierement une boite de bille (1) ou la laisser vide et passer a la suivante si on n'a pas assez de billes (0).
Ce qui nous donne :
[64] : 1, on peut la remplir entierement, il nous reste donc 123-64 billes, soit 59.
[32] : 1, il nous reste 59-32 = 27 billes.
[16] : 1, il nous reste 11 billes.
[8] : 1, il nous reste 3 billes.
[4] : 0, on ne peut pas remplir entierement notre boite, on passe à la suivante.
[2] : 1, il nous reste une bille.
[1] : 1, on a remplis toutes les boites.

123 s'écrit donc en base 2 : 1111011.

Astuce : pour trouvé la puissance de la dernière boite on peut faire un log de base 2 de notre nombre de base 10 et tronquer. Ici on aurait log2(123) = 6,94 et des poussieres, donc 6 si on tronque, or 2^6 = 64, ce qui est bien la contenance de notre premiere boite.
Si vous ne possedez pas le log2 il suffit de faire log(x)/log(2) est le résultat est le même.


3- Calculs avec les opérateurs binaires

Nous avons donc vu le and, et le &&, qui ne permettent que de faire des calculs entre deux bits.
Le & sert comme les autres opérateurs mathématiques a faire des calcules entre deux nombres.
Pour calculer nombre1 & nombre2 il faut convertir nombre1 et nombres1 en base 2. Ensuite on a plus qu'a comparer chaque bits des deux nombres entres eux.

Exemple :
549 & 320 = 10 0010 0101 & 01 0100 0000 (base 2)
Ensuite il suffit de calculer les bits des deux nombres entre eux selon les regles de and :

1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
0 & 0 = 0
0 & 0 = 0
1 & 0 = 0
0 & 0 = 0
1 & 0 = 0

donc 549 & 320 = 0

Les opérateurs or et xor fonctionnent selon le même principe.
|| et or servent à calculer deux bits entre eux et | deux nombres.
^^ et xor de même deux bits et ^ deux nombres.

4- Regles binaires

Voici donc les regles pour les opérateurs &, | et ^
-and
1 & 1 = 1
1 & 0 = 0
0 & 0 = 0
-or
1 | 1 = 1
1 | 0 = 1
0 | 0 = 0
-xor
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 0 = 0

5- Opérateurs de décalage

Les opérateurs << et >> sont des opérateurs de décalage des bits
<< décale les bits à gauche, donc pour un nombre xxxx de base 2, alors xxxx<<3 = xxxx000
>> fonctionne de la même manière mais décale les bits a droite.
<< 1 reviens donc à multiplier par 2, et << 2 par 4, soit << x a multiplier par 2^x (avec ^ signifiant puissance).

Exemples :
125 << 2 = 1111101 << 2 = 111110100 = 500
92 >> 3 = 1011100 >> 3 = 1011 = 11


6- Opérateur de complément ~

L'opérateur ~ sert a inverser les bits d'un nombre. Il faut faire attention car selon le type de variables les valeurs ne sont pas les mêmes.
Pour un unsigned char (un entié tenant sur octet non signé), ~12 = 243 car
12 = 00001100 base 2 donc ~12 = 11110011 base 2 = 243
Sous Game Maker ~x seras égal à -x-1.


7- Le systeme héxadécimal

Le systeme héxadécimal est un systeme très interressant car il est très simple de faire passer un nombre de base 2 à base 16 (de héxa).
Le systeme héxadécimal étant un systeme de base 16 il utilise donc les premieres lettres de l'alphabet en complément des chiffres traditionnels :
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.

Pour convertir un nombre de base 2 codé sur un octet il sufit de le couper en deux paquets, puis calculer a quoi correspondent chaque paquet puis remplacer par les symboles correspondants.
Par exemple :
10011101 = 9D base 16 car
1001 = 9 base 10 donc 9 base 16 et
1101 = 13 base 10 soit D en héxa


8- Utilité de ces opérateurs

Ces opérateur sont d'une utilité incroyable lorsque l'on programme et surtout lorsque l'on commence à ce raprocher de la machine. Je vais montrer de nombreux exemples à travers lesquels vous verez toute la puissance des opérateur bitwise.

Exemple 1 : Les couleurs
Les couleurs sont la plupart du temps codés sur 24bits, avec un octet pour le rouge, un autre pour le vert et le dernier pour le bleu, soit 8bits pour chaque couleurs, c'est le format RGB (pour red green blue).
Une couleur est donc composée de rouge, de vert et de bleu avec chacune de ces couleurs primaires allant de 0 à 255.
En héxadécimal on a donc toutes les valeurs possibles du noir 000000 au blanc FFFFFF soit 16777216 couleurs possibles !
Sous GM le rouge est codé sur le premier octet a droite, le vert sur l'octet du milieu et le bleu l'octet a gauche.
Couleur : [Bleu][Vert][Rouge]

Donc pour créer une couleur avec du rouge, du vert et du bleu il faut remplir le premier octet a droite avec le rouge, le second avec le vert et le dernier avec le bleu.
Soit : couleur = (bleu<< 2 octets) + (vert << 1 octet) + (rouge << 0 octet)
ce qui donne : couleur = (bleu << 16) + (vert << 8 ) + rouge
Faire << 8 revient a multiplier par 256 mais les opérateurs binaire sont plus rapides donc il vaut mieux les utiliser, de plus c'est plus propre et plus compréhensible.

Maintenant si l'on veut récupérer la tonalité de bleu d'une couleur il va faloir tout simplement récupérer le premier octet de celle-ci.
Par exemple pour la couleur 94F388 la tonalité de bleu est 94.
Il suffit de décaler les bits a droite jusqu'a qu'il ne reste que l'octet qui nous interresse soit le premier en partant de la gauche. On a donc :
bleu = couleur >> 16

Pour récuperer le vert on va procéder de la même manière :
vert = couleur >> 8
Mais ensuite comment fait-on ? Il reste l'octet codant le vert mais aussi celui qui code le bleu : [bleu][vert], on a réussit a virer l'octet codant le rouge mais il faut aussi virer celui qui code le bleu.
C'est la qu'intervient l'opérateur &. En fait il va nous permettre de récupérer notre octet :
vert = (couleur >> 8 ) & FF
Explication (x est un bit) : comme 0 & x est toujours égal à 0, et que 1 & x est toujours égal à x, faire XXYY & FF signifie donc faire XXYY & 00FF or comme on l'a vu juste avant XX & 00 seras donc égal à 0 et FF (héxa) étant donc 11111111 (base 2), YY & FF seras donc égal à YY.

Donc pour récupérer le rouge :
Le rouge étant dans [XX][YY][ZZ] à la troisieme position, il suffit donc de faire [XX][YY][ZZ] & FF car on ne garderas que le premier octet de droite. On a donc :
rouge = couleur & FF


Exemple 2 : Modifier un octet bit a bit
Si [XX] est un octet, soit [abcdefgh] en base 2 avec abcdefgh des bits, comment récupérer un des bits ou même le modifier ?
En fait c'est très simple, et les seuls opérateurs dont on auras besoin vous l'avez compris c'est & , << et >>.

Récupérer c :
Pour récupérer c, il va falloir détruire tous les autres bits, on va donc utiliser & pour ça :
[abcdefgh] & [00100000] = [00c00000]
Maintenant pour isoler c il faut le décaller pour qu'il soit en premiere position a droite :
[00c00000]>>5 = c

Récupérer un bit en général :
pour récupérer un bit en général dans un nombre on utilise d'abord & puis on décale. La seule infos dont on à besoin c'est la position du bit dans le nombre (ici ^ signifie puissance).
Bit = ( nombre & 2^position ) >> position


Exemple 3 : xor et la cryptographie

^ est très interressant car il nous permet de crypter des bits avec d'autres bits.
Ce qu'il y a de très pratique avec ^, c'est cette propriétée :
a ^ b = c
c ^ b = a
De cette manière on peut faire :
Cryptage =>
[octet secret ] ^ [ octet clé ] = [ octet crypté ]
<= Décryptage
[ octet crypté ] ^ [ octet clé ] = [octet secret ]

A vous de faire un petit algo de cryptage pour vous entrainer .

Auteur du tutorial : onilink_
19/02/2010 par M@d_Doc
10 Commentaires

par Linky439 @ 19/02/2010 10:25 am
lol j'ai perdu le fil aux nombres en binaires x)
Trop compliqué pour moi qui vient quasiment de me lever x)
Mais bien sinon hap

par bibi675 @ 19/02/2010 10:45 am
Excellent tutoriel ! Bravo Onilink_ ! super

par Topaze22 @ 19/02/2010 06:35 pm
Wow, tuto de folie ! Je me demande comment vous faite pour vous motiver à sortir des cours magistraux comme ça !?
super

par SonicZeldaMario @ 19/02/2010 07:36 pm
gha non3 ouh ouh ouh ouh ouh ouh gha gha

par daminetreg @ 23/02/2010 09:42 am
Bon tutorial, c'est vrai que sans un tel tuto il est fort probable que beaucoup de débutant en programmation, notamment s'ils passent pas la case game maker, n'ait pas connaissances de l'utilité des opérateurs binaires.

Good job done! ^^ happy1

par Ordinateur @ 10/03/2010 03:14 am
ange 100110111001010000100110101

sinpa

par gabin49 @ 15/03/2010 11:48 pm
magnifique tuto, moi meme je ne savais pas ce qu'etait ces signes : ^, ^^,<<, >>
j'en ai appris dans ce tuto, meme si j'en aurai pas vraiment l'utilité, il est très bien détaillé

par Need @ 19/04/2010 08:22 pm
question

par red-error @ 29/05/2010 03:43 pm
J'avais lu, mais décroché, maintenant c'est un peu plus clair, bravo !

Presque compris. happy1

par Red-error @ 01/08/2010 01:41 pm
Encore relu, et cette fois-ci c'est la bonne. :D
Ca manque franchement de schémas pour visualiser en fait, ou de se munir d'une feuille ou de bloc-note pour s'accrocher.

Nom:
Mail: (optionel)
Êtes vous Humain? (Entrez oui si c'est le cas)

smile's:

fleche_dfleche_gbehgniihappy1questionrirerire2rougesupertristeangeclincoeurcoleredodofierghagniahhaphehehhontenonnon3ouhouisnif

| M'oublier
[Archives News 2005] [Archives News début 2006]
Base de données des Jeux: Opérationnelle
Base de données des logiciels: Opérationnelle
Base de données des GMD: Opérationnelle
Base de données des GM6: Opérationnelle
Base de données des Librairies: Opérationnelle
Base de données des DLL: Opérationnelle
Base de données des Moteurs: Opérationnelle
Contenu Général du CBNA: Opérationnelle
Base de données Forum: Opérationnelle