v1 : ton code
len_a = len(a)
len_b = len(b)
if len_a != len_b:
if len_a < len_b:
greater_length = len_b
a_normalized = (len_b - len_a) * '0' + a
b_normalized = b
len_normalized = greater_length
else:
greater_length = len_a
a_normalized = a
b_normalized = (len_a - len_b) * '0' + b
len_normalized = greater_length
else:
a_normalized = a
b_normalized = b
len_normalized = len_a
v2 : greater_length sert à que dalle
len_a = len(a)
len_b = len(b)
if len_a != len_b:
if len_a < len_b:
len_normalized = len_b
a_normalized = (len_b - len_a) * '0' + a
b_normalized = b
else:
len_normalized = len_a
a_normalized = a
b_normalized = (len_a - len_b) * '0' + b
else:
a_normalized = a
b_normalized = b
len_normalized = len_a
v3 : lisibilité on « applatit » les if, beaucoup plus lisible d’un coup d’oeil
len_a = len(a)
len_b = len(b)
if len_a < len_b:
len_normalized = len_b
a_normalized = (len_b - len_a) * '0' + a
b_normalized = b
elif len_a > len_b:
len_normalized = len_a
a_normalized = a
b_normalized = (len_a - len_b) * '0' + b
else:
a_normalized = a
b_normalized = b
len_normalized = len_a
v4 : on fait sauter un ELSE inutile
len_a = len(a)
len_b = len(b)
if len_a < len_b:
len_normalized = len_b
a_normalized = (len_b - len_a) * '0' + a
b_normalized = b
elif len_a >= len_b:
len_normalized = len_a
a_normalized = a
b_normalized = (len_a - len_b) * '0' + b
v5 : une variante qu’on utilise trés souvent (un else de moins = moins de travail pour le processeur)
Python
len_a = len(a)
len_b = len(b)
len_normalized = len_a
a_normalized = a
b_normalized = (len_a - len_b) * '0' + b
if len_a < len_b:
len_normalized = len_b
a_normalized = (len_b - len_a) * '0' + a
b_normalized = b
v6 : max
len_a = len(a)
len_b = len(b)
len_normalized = max(len_a, len_b)
if len_a < len_b:
a_normalized = (len_normalized - len_a) * '0' + a
b_normalized = b
else:
a_normalized = a
b_normalized = (len_normalized - len_b) * '0' + b
v7 : là normalement tu t’es rendu compte que les IF ne servent à rien
len_a = len(a)
len_b = len(b)
len_normalized = max(len_a, len_b)
a_normalized = (len_normalized - len_a) * '0' + a
b_normalized = (len_normalized - len_b) * '0' + b
v8 : optimisation de bon sens
len_normalized = max(len(a), len(b))
a_normalized = (len_normalized - len(a)) * '0' + a
b_normalized = (len_normalized - len(b)) * '0' + b
FIN
v9 bonus ; tu pouvais pas deviner mais la fonction zfill est géniale pour ça
len_normalized = max(len(a), len(b))
a_normalized = a.zfill(len_normalized)
b_normalized = b.zfill(len_normalized)
plus aucune optimisation possible
Voici une autre facon de faire que je souhaite te montrer
C’est typiquement un exercice « scolaire », qui te pousse à réfléchir en amont à ce que contient ce tableau de correspondance
# Table de correspondance : (a, b, carry_in) -> (bit_sortant, carry_out)
TABLE = {
('0', '0', 0): ('0', 0),
('0', '1', 0): ('1', 0),
('1', '0', 0): ('1', 0),
('1', '1', 0): ('0', 1),
('0', '0', 1): ('1', 0),
('0', '1', 1): ('0', 1),
('1', '0', 1): ('0', 1),
('1', '1', 1): ('1', 1),
}
def addition_table(a, b):
taille = max(len(a), len(b))
a = a.zfill(taille)
b = b.zfill(taille)
carry = 0
total_bin = ""
for i in range(1, taille + 1):
bit, carry = TABLE[(a[-i], b[-i], carry)]
total_bin = bit + total_bin
return (carry * '1') + total_bin
v1 de la suite de ton code
for i in range(len_normalized):
position = len_normalized - 1 - i
val_a = a_normalized[position]
val_b = b_normalized[position]
if int(val_a) + int(val_b) + carry == 0:
carry = 0
total_bin = '0' + total_bin
elif int(val_a) + int(val_b) + carry == 1:
carry = 0
total_bin = '1' + total_bin
elif int(val_a) + int(val_b) + carry == 2:
carry = 1
total_bin = '0' + total_bin
elif int(val_a) + int(val_b) + carry == 3:
carry = 1
total_bin = '1' + total_bin
if carry == 1:
total_bin = '1' + total_bin
carry = 0
v2
for i in range(len_normalized):
position = len_normalized - 1 - i
val_a = a_normalized[position]
val_b = b_normalized[position]
somme = int(val_a) + int(val_b) + carry
if somme == 0:
carry = 0
total_bin = '0' + total_bin
elif somme == 1:
carry = 0
total_bin = '1' + total_bin
elif somme == 2:
carry = 1
total_bin = '0' + total_bin
elif somme == 3:
carry = 1
total_bin = '1' + total_bin
if carry == 1:
total_bin = '1' + total_bin
carry = 0
v3 : pas obligatoire mais pour le fun je te montre : on perds en lisibilité mais c’est une optimisation
L’étape suivante consiste à regrouper les cas par valeur de carry :
Si somme vaut 0 ou 1 la retenue passe à 0.
Si somme vaut 2 ou 3, la retenue passe à 1.
Le bit ajouté est ‘1’ si la somme vaut 1 ou 3, sinon ‘0’.
On sépare la décision pour la retenue et pour le bit à ajouter :
for i in range(len_normalized):
position = len_normalized - 1 - i
val_a = a_normalized[position]
val_b = b_normalized[position]
somme = int(val_a) + int(val_b) + carry
if somme >= 2:
carry = 1
else:
carry = 0
if somme == 1 or somme == 3:
total_bin = '1' + total_bin
else:
total_bin = '0' + total_bin
if carry == 1:
total_bin = '1' + total_bin
carry = 0
v4
for i in range(len_normalized):
position = len_normalized - 1 - i
val_a = a_normalized[position]
val_b = b_normalized[position]
somme = int(val_a) + int(val_b) + carry
carry = somme // 2
total_bin = str(somme % 2) + total_bin
if carry == 1:
total_bin = '1' + total_bin
carry = 0
v5
for i in range(1, len_normalized + 1):
val_a = a_normalized[-i]
val_b = b_normalized[-i]
somme = int(val_a) + int(val_b) + carry
carry = somme // 2
total_bin = str(somme % 2) + total_bin
if carry == 1:
total_bin = '1' + total_bin
carry = 0
v6
for i in range(1, len_normalized + 1):
somme = int(a_normalized[-i]) + int(b_normalized[-i]) + carry
carry = somme // 2
total_bin = str(somme % 2) + total_bin
if carry == 1:
total_bin = '1' + total_bin
v7
for i in range(1, len_normalized + 1):
somme = int(a_normalized[-i]) + int(b_normalized[-i]) + carry
carry = somme // 2
total_bin = str(somme % 2) + total_bin
total_bin = carry * '1' + total_bin
