Une première idée serait de coder le signe + par un 0 et le signe - par un 1. Ainsi $6_{10}=110_{2}$ se coderait alors en $0110_{2}$. Mais $-6_{10}$ se coderait alors en $1110_{2}$
Représenter $14_{10}$ en binaire. Que remarquez vous?
Par conséquent nous allons devoir pous fixer un nombre de bits, $n$, un espace mémoire. On conserve alors le premier pour le signe et les $n-1$ autres pour le codage de la valeur absolue du nombre.
Ainsi sur 8 bits $-6_{10}$ se code en $1|0000110$
Déterminer le codage en binaire sur 8 bits puis sur 9 bits, des nombre suivants :
Un premier problème avec cette représentation est que le chiffre $0_{10}$ a deux représentations. En effet sur 3 bits: $0_{10}=0|00_{2}$ et $0_{10}=1|00_{2}$
Un autre problème se pose avec cette méthode sur l'addition de deux nombres en binaires.
Reprenez la représentation en binaire de $-35$ sur 8 bits et ajouter la à la représentation de 35 sur 8 bits.
Oubliez donc cette option !
La représentation d'un nombre entier naturel en binaire se fait de la même manière que dans le paragraphe précédent.
Si on dispose de $n$ bits, le premier sera 0 pour indiquer que l'entier est positif. Et les $n-1$ autres seront le codage en binaire de l'entier.
Cela signifie aussi que si l'on dispose de $n$ bits, nous ne pourrons pas dépasser un entier plus grand que $2^{n-1}-1$. Puisque nous ne disposons que de $n-1$ bits.
Si l'on dispose de 5 bits. On a $12_{10}=01100_{2}$.
Si l'on dispose que de 4 bits. On ne peut tout simplement coder 12 en binaire si nous considérons les entiers relatifs.
Rappelez vous que sur $n$ bits un entier naturel ne pouvait pas dépasser $2^{n}-1$. Quand nous codons des entiers relatifs, nous ne pourrons pas dépasser $2^{n-1}-1$ sur $n$ bits.
Pour représenter un entier négatif nous allons utiliser le "complément à deux":
Voila la procédure :
Traitons le cas de $-12$ sur 8 bits :
Nous sommes sur 8 bits le 1 à la première position doit être enlevé. Nous retombons bien sur 0.
Avec n bits nous pouvons coder uniquement des entiers compris entre $-(2^{n-1}-1)$ et $2^{n-1}-1$
C'est le cas puisque le premier bit est réservé au signe de l'entier.
Ecrire une fonction en Python dec_en_binaire(entier,nb_bit)
qui converti un entier naturel en binaire. La fonction renverra le binaire sous forme de liste sur nb_bit.
Des méthodes utiles :
a%b
renvoie le reste de la division de a par b
a//b
renvoie le quotient de la division de a par b
l.append(a)
ajoute à la liste l l'élément a
l.reverse()
inverse les élements d'une listeTestez :
Vous devriez avoir :
L'objectif de cet exercice est d'écrire une fonction en Python
dec_relatif_en_binaire(entier,nb_bit)
qui converti un entier relatif en binaire sur nb_bit
.
Il faudra penser à gérer le manque de bits et renvoyer un message d'erreur explicite.
change_0_en_1(l)
qui remplace les 1 en 0 et les 0 en 1 dans une liste. ne contenant que des 0 et des 1.Testez :
Vous devriez avoir :
ajoute_1(lst)
qui ajoute 1 à un binaire représenté dans une liste
Vous devriez avoir :
dec_relatif_en_binaire(entier,nb_bit)
abs()
pour la valeur absolue d'un nombre.
Testez :
Vous devriez avoir :
Ecrire une fonction binaire_en_dec(l)
qui a pour argument une liste `l` correspond à un entier écrit en binaire et qui renvoie l'entier en décimal
Testez :
Vous devriez avoir :
Ecrire une fonction add(nb1,nb2,nb_bit)
qui renvoie le résultat de la somme de nb1 et de nb2 en binaire sur nb_bit
.
Testez :
Vous devriez avoir :
Il faut bien distinguer le nombre binaire de sa représentation en binaire.
$12_{10}=1100_{2}$ mais en représentation en complément à 2 sur 4 bits $1100_{2}=-4$