Aller au menu - Aller au contenu

Les calculs en binaire


Informations sur le tutoriel

AvatarAvatar
Auteurs : distopia et Sergeswi
Difficulté : Facile
Visualisations : 14 405
Licence : Creative Commons BY-SA


Plus d'informations Plus d'informations

Historique des mises à jour

  • Le 17/11/2009 à 02:04:32
    ajout d'un QCM
  • Le 02/09/2009 à 20:53:30
    correction alerte #849
  • Le 01/09/2009 à 12:51:49
    explications clarifiées
Vous avez toujours rêvé d'additionner des nombres ... en binaire ? Alors ce tuto est fait pour vous ! ^^

En effet, vous allez apprendre ici à effectuer, manuellement, des opérations en binaire.

Avant de commencer il peut être utile (logique mais pas obligatoire) de savoir convertir un nombre décimal en binaire et inversement.
Pour cela, n'hésitez pas à vous reporter au tutoriel de Dentuk.

Ce cours n'est pas indispensable pour programmer avec un langage comme le C ou le Java mais si un jour vous comptez utiliser des micro-contrôleurs, ou simplement réaliser une application en Assembleur, ces connaissances pourront vous être utiles.


Attention, un QCM vous attend à la fin !

Ecrire un nombre négatif

Avant de commencer, sachez que tous les exemples que je donnerais par la suite seront fait avec des chars (car je suis une feignasse et que écrire un int en binaire c'est trop long). Cependant que ce que vous allez apprendre ici fonctionne avec tout les types de variables gérant les entiers (char, long, int) mais pas avec les variables acceptant aussi les nombres à virgule (float, double).
En effet ces derniers ne sont pas codés de la même manière:

Les variables pour les entiers sont codés en binaire en utilisant tous les bits pour donner la "valeur" du nombre .

Plan de Char

Ainsi un char qui est (en théorie) codé sur 8 bits pourra avoir 256 (2⁸) valeurs différentes.

Ah! Un détail (important): Si le char est employé en tant que "unsigned" (variable toujours positive) le bit 7 sert à donner la valeur du nombre mais si on l'utilise en tant que "signed" ce bit sert à donner le signe du nombre (0 = positif, 1 = négatif).
Ainsi 1000 1111 est égal à 143 si la variable est non-signé et à -113 en cas contraire (Si vous lisez la fin de cette partie, vous comprendrez comment je fais pour "deviner" ça :) ).



Par opposition, les variables gérant les nombres à virgule utilisent une partie des bits pour donner la "valeur" du nombre et le reste pour donner la position de la virgule.

Par exemple pour un nombre codé sur 32 bits (float):

Plan de nombre à virgule

Les bits 0 à 22 servent à coder le nombre sans tenir compte de la virgule (3616.999 s'écrit donc 3616999).
Les bits 23 à 30 servent à donner l'exposant (la position de la virgule quoi ;) ).
Le bit 31 sert préciser le signe.

Si vous êtes curieux et que vous voulez en savoir plus : RTFM :p



Bien... Et si nous commencions le cours ?

Si vous avez lu le tutoriel de Dentuk sur la conversion décimal/binaire, vous devez savoir que 1 s'écrit 0000 0001.

Mais savez-vous écrire -1 ?


Pour pouvoir le savoir on a, en gros, deux méthodes : une simple que vous allez aimer et une plus compliquée que vous utiliserez :

La méthode simple :
On sait que 0 - 1 = -1
donc:

Calcul 1

(Si ce n'est pas clair pour vous, vous pouvez imaginer que 0000 0000 = 1 0000 0000 mais que le 1 "dépasse" de la variable donc qu'on ne l'écrit pas).
Parbleu !! Mais alors -1 s'écrit de la même manière que 255 ?!?
Et oui, c'est pour cela qu'il faut bien comprendre la différence entre les nombres signés et les autres.

Ainsi :

Calcul 2 -1 - 1 = -2  (= 254)
(Si vous êtes perdu, passez à la partie suivante qui parle des additions et soustractions cela sera peut-être plus clair après).




Ça va, vous suivez ?

J'espère que oui car voici la méthode plus compliquée !

Attends ! Pourquoi on utiliserait une technique plus dure si on connait celle-ci ? On ne va pas se compliquer la vie pour rien !

Excellente question ! Et bien tout simplement parce que la méthode plus compliquée permet de travailler aussi bien sur des petits nombres que sur les grands.
Non pas que cette méthode ne puisse pas mais essayez de trouver l'équivalent binaire de -19 de tête :
Calcul 3
(Moi, personnellement, j'ai un peu de mal).



La méthode compliqué (aussi appelé "complément à deux") :
  1. Tout d'abord vérifier que le nombre à convertir en binaire est négatif (Ben ouais, on ne va pas se compliquer la vie pour rien)
    • Si le nombre est positif pas de soucis vous savez (normalement) le faire
  2. Si le nombre est négatif (par exemple -19)
    • On convertit sa valeur absolue en binaire (dans notre cas on écrit donc 19 en binaire : 0001 0011)
    • On inverse tous les bits du nombre (0001 0011 devient 1110 1100)
    • On ajoute 1 au résultat précédent :
      Calcul 4
    • -19 est donc égal à 1110 1101 (et voilà ! C'était pas trop dur, avouez ! (C'est juste long))



Petit détail :

Voici un tableau représentant l'équivalent décimal de la valeur des variables "signées" de type char.

Calcul 5

Comme les nombres négatif ont toujours un 1 comme bit de poids fort, ils sont représentés au dessus des nombres positif dans ce tableau.

Vous constaterez ici que le 0 est considéré comme un nombre positif, donc que ces derniers ne vont que jusqu'à 127 tandis que les négatifs atteignent -128.

Une autre particularité dû à cette façon de coder les nombres négatifs est que si une variable atteint le maximum 127 pour un char) et qu'elle est incrémentée, elle passera directement à -128.
(Alors que la même chose pour une variable « unsigned » la fait repartir à 0).

Essayez, vous verrez :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char k = 0;
    do					 
    {
        printf("%ld\n", k);
        k++;			         //    j'incrémente ma variable
    }
    while(k>=0);
    printf("%ld\n", k);			  //    Tadam!!

    return 0;
}


Bien entendu ce problème peut aussi se retrouver dans les calculs si le résultat dépasse la valeur maximale permise par la variable.
(Faites attention !)

Addition et soustraction

Bien, passons maintenant aux calculs !

Ne vous en faites pas, on ne va faire que des choses simples (déjà parce que je suis une bille en math et parce que les processeurs aussi (c'est dit sans méchanceté hein ! ;) ))
Ainsi les seuls calculs que l'on va aborder seront l'addition, la soustraction, la multiplication et ... la division !

Les additions



Commençons en douceur avec l'addition (que vous avez déjà employé si vous avez fait des essais dans la partie précédente).

On va commencer par définir ce que j'appelle une "table de vérité" (en fait c'est peut-être même son vrai nom).
Cette table de vérité est une liste des différentes possibilités qu'un calcul peut donner :

CalculRésultatCalcul binaireRésultat binaire
0 + 0 0 0000 + 0000 0000
0 + 1 1 0000 + 0001 0001
1 + 0 1 0001 + 0000 0001
1 + 1 2 0001 + 0001 0010


Un petit rappel :
addition
Lorsque vous faites ce calcul, vous savez que 9 + 4 fait 13. Vous mettez donc 3 en bas à droite et vous gardez quoi ? Eh oui, une retenue ;) . La retenue (ici, 1) s’ajoute au chiffre d’après.
Et bien en binaire c'est pareil :
addition binaire


On va faire un exemple. Allez, 6 + 14 = 20 ;)

En binaire :

Addition - 6 plus 14 (étape 1)

Bit n°0 : 0 + 0 = 0

On commence facile ;)

Addition - 6 plus 14 (étape 2)

Bit n°1 : on tombe sur un cas de retenue. 1 + 1 = 10 donc on met le 0 dans le résultat et on garde le 1 en retenue. Ce qui donne donc :

Addition - 6 plus 14 (étape 3)

Bit n°2 : que voit-on ? Le calcul est 1 + 1 mais attention ! Il ne faut pas oublier la retenue d'avant ! Ce qui donne en réalité 1 + 1 + 1 : en binaire 11 (3). On met donc 1 dans le résultat et on garde une nouvelle retenue de 1.

Addition - 6 plus 14 (étape 4)

Bit n°3 : le calcul aurait du être 0 + 1 (je n'ai même pas mis le 0, voyez) mais n'oubliez pas la retenue ! Et oui ! :D Le calcul exact est donc 1 + 1 = 10 ; on met donc 0 au résultat et 1 en retenue. Et comme il n'y a plus rien après la retenue tombe toute seule au résultat ;) .

Addition - 6 plus 14 (étape 5)

Et voilà ! :) Vous pouvez vérifier que 20 en binaire s'écrit bien 10100.

Voilà, les additions sont finies. C'était pas si dur, hein ;)





Les soustractions



Voyons d'abord la table de vérité :

CalculRésultatCalcul binaireRésultat binaire
0 - 0 0 0000 - 0000 0000
0 - 1 -1 0000 - 0001 1111
1 - 0 1 0001 - 0000 0001
1 - 1 0 0001 - 0001 0000


La ligne 2 est un peu particulière je l'explique ci-dessous :
Quand vous tombez sur un chiffre qui doit se faire soustraire par un plus grand que lui, vous prenez une dizaine à gauche du chiffre pour pouvoir soustraire ;) .
Par exemple, quand vous faites:
soustraction
5 – 8 n’est pas facile à réaliser. Mais si l’on prend 15 – 8 … c’est tout de suite plus simple ;) . Ce qui nous donne :
15 - 8 = 7

Ce qui nous donne :
soustraction

3_ – 2_ = 1_ donc 45 – 28 = 17

Et bien, en binaire c'est pareil : vous prenez une «paire» (une dizaine en binaire) au bit supérieur et mettez ce qui reste dans les unités.

Un petit exemple :

15 - 6 = 9

Soustraction en binaire - 15 moins 6 (étape 1)

C'est une soustraction très simple :

  • Bit n°0 : 1 - 0 = 1
  • Bit n°1 : 1 - 1 = 0
  • Bit n°2 : 1 - 1 = 0
  • Bit n°3 : 1 - 0 = 1


Ce qui donne :

Soustraction en binaire - 15 moins 6 (étape 2)

On vérifie : 9(10) = 1001(2) ! Nous n'avons pas eu le cas de l'emprunt de dizaine mais il va bien falloir faire un exemple plus compliqué :D .

10 - 5 = 5

Soustraction - 10 moins 5 (étape 1)

On commence avec 0 - 1. Vu que c'est impossible on va aller emprunter une paire à gauche (paire en binaire, dizaine en décimal). Donc cela donne 10 - 1 et c'est bien plus réalisable ! Le résultat étant 1, on l'inscrit et hop, c'est fait :) .

Soustraction - 10 moins 5 (étape 2)

Maintenant, le bit n°1 : on a un 1 qui s'est soustrait à droite donc il n'y est plus. On a donc 0 - 0 et euh le résultat est évident :D ...

Soustraction - 10 moins 5 (étape 3)

Enfin, on retrouve la même situation qu'au bit n°0 : 0 - 1 ... on prend donc le 1 de gauche et ça donne : 10 - 1 = 1 :

Soustraction - 10 moins 5 (étape 4)

Et voilà, c'est fini :) . 5 en binaire s'écrit bien 101. Si vous avez compris comment ça marche, vous n'aurez pas de soucis avec les divisions :o !

Multiplication et division

Vous savez maintenant additionner et soustraire. Mais que pensez-vous de multiplier des nombres en binaire ?!

Les multiplications



En comparaison des soustractions (que j'espère vous maitrisez) les multiplications en binaire sont simples, très simples.
Voici leur table de vérité :

CalculRésultatCalcul binaireRésultat binaire
0 * 0 0 0000 * 0000 0000
0 * 1 0 0000 * 0001 0000
1 * 0 0 0001 * 0000 0000
1 * 1 1 0001 * 0001 0001


Logique, non ? :p

En fait, ceci constitue la base même des mathématiques élémentaires (c'est vous dire ^^ ). Tout nombre de quelque base de numération qu'il soit, lorsqu'il est multiplié par zéro donne pour résultat zéro et lorsqu'il est multiplié par un donne pour résultat lui-même. Ca me rappelle mes cours de collège :D .


La table de vérité est très simple mais, pour les calculs, il y a un détail qui peut réduire à néant votre multiplication si vous le négligez ^^ .

Essayons de multiplier 3 par 2 (en décimal ça vaut 6):

Multiplication de 3 par 2 en binaire (étape 1)

Ne vous méprenez pas ! Ici ce sont bien deux nombres en binaire (11 et 10) et non pas en décimal (onze et dix) même si vous allez le voir ... enfin je vous dis rien :p .


Ici, on n'a que deux bits, ouf :D .

  • Bit n°0 : 11 * 0 = 0
  • Bit n°1 : 11 * 1 = 11


Mais ensuite il faut faire attention au décalage qui peut tout fausser :colere2: . Nos résultats sont justes : 11 * 0 donne bien 0 et 11 * 1 donne bien 11. Mais la différence entre ces deux calculs est que l'on ne les a pas effectués dans la même colonne (donc pas le même exposant). C'est donc de ce décalage qu'il faut se méfier.

En images, cela sera sûrement plus clair ;)

Multiplication de 3 par 2 en binaire (étape 2)

Dans l'ordre, on fait 11 * 0 et on écrit le résultat dans la colonne où l'on a commencé (ici, la première). Vient le tour du 11 * 1. Mais ce calcul, on l'a commencé à partir de la colonne du 1 donc la deuxième. Ce décalage fait que l'on doit inscrire le résultat dans la bonne colonne, sinon, tout est fichu !

Et enfin, il suffit simplement d'additionner les résultats en faisant attention à ce sacré décalage ;) .

Multiplication de 3 par 2 en binaire (étape 3)

Attends ! Je rêve où je vois que 11 * 10 en binaire donne 110 ?!


Et bien oui. L'avantage du binaire est qu'il n'y a que deux chiffres, 1 et 0. Multiplier par 1 ou 0 est assez simple. Dans cette logique on peut multiplier par 10 aisément. Si je vous dis 1011010 * 10 vous y arriverez en quelques secondes. Cette technique sera plus compliquée pour une multiplication par 11, je vous l'accorde :p .

Mais alors pourquoi se casser la tête avec ta méthode ?


Bah parce que ... il vous faut bien des explications :honte: . Que ceux qui sont pour la méthode de tête à l'arrachée fassent le calcul suivant :

Multiplication impossible en binaire

Qui m'aime me suive ^^ .

Secret (cliquez pour afficher)
Le résultat décimal est 7980 ... :p




Les divisons



Et pour finir les divisions!

Ah, le big morceau ! :D

Je ne mets pas de table de vérité car dans ce cas je ne la trouve pas vraiment utile : la division est en fait une suite de soustractions (comme la multiplication est une suite d'additions d'ailleurs).

De toute manière, les calculs en binaire utilisent les mêmes « méthodes » que ceux en base 10 alors il suffit (en théorie) d'avoir été sage à l'école en primaire pour pouvoir se débrouiller.
Nous parlerons ici de divisions euclidiennes (c'est-à-dire avec reste) alors sortez vos cahiers poussiéreux et en avant ! :)

Bon on va prendre un exemple... hmmmm ... 23 / 5
On va déjà le faire en décimal (on commence facile :p ). Je vous rappelle rapidement comment ça marche : on veut savoir combien de fois rentre 5 dans 23 et combien il reste. De tête ça donne 4, reste 3 car 5 * 4 + 3 = 23.

Division de 23 par 5 en décimal, étape 1

23 - 5 = 18. Hop, on a retranché 5 une fois, on met une petite barre pour compter une fois dans la barre de droite ... et ainsi de suite ;) .


Au final, ça donne :

Division de 23 par 5 en décimal, étape 2

J'espère que c'est O.K. pour vous ? :) Si c'est le cas, bah ... vous aurez aucun mal avec le binaire puisque c'est exactement la même chose.

On va prendre le même exemple en binaire. Si vous avez bien compris les soustractions, ça devrait pas trop être problématique ;)

Bon, allez, je suis en forme, je vous donne les équivalents binaires de tête !

  • 23(10) = 10111(2)
  • 5(10) = 101(2)


Ce qui donne :

Division de 23 par 5 en binaire, étape 1

Euh ... j'espère que jusque là vous suivez.

Allez : maintenant il s'agit simplement d'enlever 5 jusqu'à ce que le reste soit plus petit que 5, indiquer le reste, le nombre de fois où 5 est rentré dans 23 ... allez, au boulot ! :D

...

...

On corrige ? :)

On va le faire ensemble ;)

On a donc 23 - 5, ce qui donne 18.

En binaire :

Division de 23 par 5 en binaire, étape 2

Simple soustraction, on n'a pas eu besoin de prendre une dizaine. Je ne veux pas m'étendre sur les opérations donc je les mets en secret pour ceux qui veulent ;)

Secret (cliquez pour afficher)


  • Bit n°0 : 1 - 1 = 0
  • Bit n°1 : 1 - 0 = 1
  • Bit n°2 : 1 - 1 = 0
  • Bit n°3 : 0 - 0 = 0
  • Bit n°4 : 1 - 0 = 1


On vérifie : 18(10) = 10010(2) ! On a réussi :D . On ajoute donc "1" au nombre de fois où 5 est rentré dans 23 et ainsi de suite ;) .

Division de 23 par 5 en binaire, étape 3

18 - 5 = 13

o_O J'ai rien compris à ton calcul ! Help !


Je vais vous expliquer. Vous avez normalement du voir cette explication dans la partie sur les soustractions mais un exemple bien concret comme celui-là vous fera pas de mal :-°

Voyons cela bit par bit :

Bit n°0 : ça commence fort ! 0 - 1 ! Comme vous avez sûrement du le voir dans la partie précédente, le 0 va devoir emprunter à gauche un 1 pour pouvoir soustraire : ainsi, ce sera plus simple pour lui. On a donc 10 - 1 = 1

Bit n°1 : on a pas trop le choix : le zéro soustrait un zéro et ça donne un zéro :D .

Bit n°2 :
si vous avez bien suivi vous voyez que le bit n°2 est un 0 qui doit soustraire un 1. Il va donc pour cela prendre une paire (une dizaine en binaire) à gauche de lui ... mais à sa gauche, il y a un zéro o_O ! On rentre dans une véritable chaîne. Le zéro (bit n°2) va prendre une paire au zéro à gauche (bit n°3) qui va lui même prendre une paire à gauche (bit n°4) :o .

Je vais maintenant vous donner une astuce qui vous rendra la vie plus facile. Arrivé au bit n°2 vous oubliez les bits d'avant (0 et 1). Et que voyez-vous ? 100 - 1. Soit ... 4 - 1.

3 en binaire s'écrit bien 11 !.

Ainsi il vous suffit d'inscrire le résultat dans la colonne de départ du calcul et hop, c'est fait ;)

On passe à la suite (on en est à 13 - 5)

Division de 23 par 5 en binaire, étape 4

Me dites pas que vous avez besoin d'explications ! :lol:

Bon, allez, pour ceux qui comprennent vraiment pas

Secret (cliquez pour afficher)
  • Bit n°0 : 1 - 1 = 0
  • Bit n°1 : 0 - 0 = 0
  • Bit n°2 : 1 - 1 = 0
  • Bit n°3 : 1 - 0 = 1


Facile, hein ;)


Vérifions : 8(10) = 1000(2)

Allez, c'est presque fini ;)

8 - 5 = 3

Division de 23 par 5 en binaire, étape 5

Mais t'es fou ou quoi ??? Tu veux nous tuer avec tes emprunts ???


Je pense qu'il est temps que l'on parle de la méthode tricherie :p . A vrai dire, c'est celle que j'ai employé quasiment tout le temps, car soyons honnête : c'est bien plus simple, c'est plus rapide et c'est juste.

Méthode de triche : on sait que 8 - 5 = 3. Alors dans le résultat on écrit ... 11 (3 en binaire) !
C'est tout simple, non ? On ne se préoccupe pas de savoir quels calculs il faut effectuer ... non, non et non, plus d'emprunts ! :lol:



On a fini, au fait ^^ . Voici le résultat de la division sous forme de division :o :

Division de 23 par 5 en binaire, étape 6

Si vous avez compris ça (et que vous arrivez à le refaire) les divisions n'ont plus de secret pour vous.

Bah en fait ... ça passe vite ... ce tuto est presque fini :o . J'ai pas vu le temps passer ^^ .







Q.C.M.

Combien font 1011(2) + 10100(2) en base 2 ?
Multipliez 20 par 3

20(10) = 10100(2)
J'espère que vous vous rappelez de vos tables de multiplication :p

Quelle(s) erreur(s) se sont glissées dans la table de multiplication de ce nombre ?

101 * 0 = 0
101 * 1 = 1010
101 * 10 = 1011
101 * 11 = 1111
101 * 100 = 10101
101 * 101 = 11001

La multiplication par ...
Faites la division avec reste de 50 par 4

C'est pas évident alors allez-y doucement, vous devriez y arriver ;) .


50(10) = 110010(2)
4(10) = 100(2)

Statistiques de réponses au QCM


Ainsi s'achève ce tutoriel : vous savez désormais additionner, soustraire, multiplier et diviser des nombres en binaire ! Vous allez désormais pouvoir impressionner vos proches avec les connaissances que vous avez acquises ici ;) . Bonne continuation :) .

Informations sur le tutoriel

Retour en haut Retour en haut

Créé : Le 26/06/2009 à 18:12:37
Modifié : Le 17/11/2009 à 02:04:32
Avancement : 100%

33 commentaires