Table des matières

Conversions entre un nombre entier et sa représentation binaire, y compris binaire signée (complément à 2)

Conversion nombre entier -> chaîne binaire non-signée

Cette fonction permet de convertir un nombre entier positif ou nul, dans sa représentation binaire. Par exemple:

dec2bin(75) => "1001011"

Il est aussi possible de fixer la longueur du mot en nombre de bits, et la chaîne binaire est alors complétée si nécessaire avec des “0” à gauche. Par exemple pour un mot de 12 bits:

dec2bin(75,12) => "000001001011"

Le principe de calcul est le suivant. On part du nombre d. Si d est pair, son bit de droite est “0”, sinon, il est “1”. On remplace alors d par d divisé par 2 et on recommence en ajoutant le résultat (“0” ou “1”) à gauche de la chaîne cherchée b. Jusqu'à ce que d soit nul. Et on renvoie la chaîne binaire b.

Comme cet algorithme renvoie une chaîne vide lorsque d=0, on traite ce cas dès le départ en renvoyant b=“0”.

Au lieu de renvoyer simplement b, on renvoie b.zfill(nb) qui complète éventuellement par des “0” à gauche de b pour que la chaîne binaire soit de la longueur demandée par nb. Bien sûr, quand nb=0 ou non donné à l'appel de la fonction, rien n'est ajouté.

Pour diminuer le temps de calcul, on a utilisé des opérations sur les bits au lieu des opérations de calcul habituels:

Egalement pour gagner du temps, on utilise une astuce pour convertir le chiffre 0 ou 1 en caractère “0 ou “1”:

Voilà le code proposé:

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
def dec2bin(d,nb=0):
    """dec2bin(d,nb=0): conversion nombre entier positif ou nul -> chaîne binaire (si nb>0, complète à gauche par des zéros)"""
    if d==0:
        b="0"
    else:
        b=""
        while d!=0:
            b="01"[d&1]+b
            d=d>>1
    return b.zfill(nb)
 
# Exemple d'utilisation:
print dec2bin(75)  # affiche: "1001011"
print dec2bin(75,12)  # affiche: "000001001011" 

Conversion nombre entier -> chaîne binaire signée

Cette fonction permet de convertir un nombre entier quelconque positif ou négatif, dans sa représentation binaire signée. Par exemple:

dec2bins(-91) =>        "10100101"
dec2bins(-91,12) => "111110100101"

dec2bins(-41) =>         "1010111"
dec2bins(-41,8) =>      "11010111"

Principe de la représentation binaire signée avec le “complément à 2”. Exemple avec le nombre négatif -91:

Avec cette opération, un mot de 8 bits, qui aurait pu représenter des valeurs positives entre 0 et 255, pourra contenir des valeurs signées entre -128 et +127.

La taille minimale d'un binaire signée est de 2 bits, soit un bit de donnée et un bit de signe. Cela permet de coder 4 valeurs:

Vous voyez d'ailleurs avec cet exemple, que la représentation binaire signée de 0 n'est pas “0”, mais “00” parce qu'il faut le bit de signe!

Vous vous rendez bien compte que la taille du mot compte dans la représentation binaire signée:

Dans une version précédente de la fonction dec2bins(), je rendais obligatoire de donner la taille du mot. J'ai adopté ici un mode de calcul plus général:

Tout cela suppose, bien entendu, que la taille du mot donnée soit suffisante pour représenter le nombre donné en binaire signé! Pour rester simple, le code ci-dessous n'a fait aucune vérification des données.

Utilise la fonction dec2bin() décrite plus haut.

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
def dec2bins(d,nb=0):
    """dec2bins(d,nb=0): conversion nombre entier signé d -> chaîne binaire pour un mot de nb bits (=0 par defaut) """
    # calcul de la taille mini du mot permettant de représenter la valeur signée d (signe compris)
    n=1
    if d>=0:
        x=d
    else:
        x=-d-1
    while (1<<n)<=x:
        n+=1
    n+=1
    # valeur de nb à prendre pour la suite des calculs (si nb<n, le nb donné est trop faible pour le d donné)
    if (nb==0) or (nb<n):
        nb=n
    # calculs
    if d>=0:
        # on renvoie la chaîne normale, complétée par des "0" à gauche et par le bit de signe = "0"
        b='0' + dec2bin(d,nb-1)
    else:
        # on renvoie la chaîne signée, complétée par des "1" à gauche et par le bit de signe "1"
        b='1' + dec2bin((1<<(nb-1))+d,(nb-1))
    return b
 
# Exemple d'utilisation:
print dec2bins(-2) # affiche: '10'
print dec2bins(-1) # affiche: '11'
print dec2bins(0) # affiche: '00'
print dec2bins(1) # affiche: '01'
print
print dec2bins(-2,8) # affiche: '11111110'
print dec2bins(135) # affiche: '010000111'
print dec2bins(135,16) # affiche: '0000000010000111'
print dec2bins(-75) # affiche: '10110101'
print dec2bins(-75,8) # affiche: '10110101'
print dec2bins(-91) # affiche: '10100101'
print dec2bins(-91,12) # affiche: '111110100101'
print dec2bins(-41) # affiche: '1010111'
print dec2bins(-41,8) # affiche: '11010111'
print dec2bins(2,8) # affiche: '00000010'
print dec2bin(s127,8) # affiche: '01111111'
print dec2bins(127,12) # affiche: '000001111111'
print dec2bins(0,8) # affiche: '00000000'

Convertion chaîne binaire non-signée -> nombre entier

Ça, c'était facile: ça existe déjà dans Python! Exemple:

int("1001011",2) => 75

Pour des raisons d'homogénéité, et afin de pouvoir faire des contrôles sur la donnée, je propose une fonction qui fait la même chose:

bin2dec("1001011") => 75
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
def bin2dec(b):
    """bin2dec(b): Conversion chaîne binaire de longueur quelconque -> nombre entier positif"""
    return int(b,2)
 
# Exemple d'utilisation:
print bin2dec("1001011")  # affiche 75

Convertion chaîne binaire signée -> nombre entier positif ou négatif

Cette fonction permet de convertir une chaîne binaire signée en nombre positif ou négatif. Par exemple:

bin2decs("111110100101") => -91

Le principe de calcul est simple:

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
def bin2decs(C):
    """bin2decs(C): Conversion chaîne binaire signée de longueur quelconque -> nombre entier signé"""
    if C[0]=="0":
        # le 1er chiffre est un '0' => le résultat sera positif
        return int(C,2)
    else:
        # le 1er chiffre est un '1' => le résultat sera négatif
        return int(C,2)-(1<<len(C))
 
# Exemple d'utilisation:
print bin2decs("111110100101")  # affiche -91