Ou exclusif entre deux tableaux
L'opérateur « ou exclusif » entre deux bits renvoie 1 si le premier est égal à 1 ou le second, mais pas les deux (exclusion du cas où les deux sont égaux à 1). Il est symbolisé par le caractère ⊕.
Ainsi :
- 0 ⊕ 0 = 0
- 0 ⊕ 1 = 1
- 1 ⊕ 0 = 1
- 1 ⊕ 1 = 0
On représente ici une suite de bits par une liste contenant des 0 et des 1.
Exemples :
liste_a = [1, 0, 1, 0, 1, 1, 0, 1]
liste_b = [0, 1, 1, 1, 0, 1, 0, 0]
liste_c = [1, 1, 0, 1]
liste_d = [0, 0, 1, 1]
Ou exclusif entre tableaux
Écrire la fonction ou_exclusif_listes
qui prend en paramètres deux listes non vides de même longueur (constituées uniquement de 0 et de 1) et qui renvoie
une liste où l’élément situé à la position i
est le résultat, par l’opérateur « ou exclusif », des éléments à la position i
des listes passées en paramètres.
En considérant les quatre exemples ci-dessus, on obtient :
>>> ou_exclusif_listes(liste_a, liste_b)
[1, 1, 0, 1, 1, 0, 0, 1]
>>> ou_exclusif_listes(liste_c, liste_d)
[1, 1, 1, 0]
Contrainte
Vous ne devez pas utiliser l'opérateur ^
de Python.
👉 On n'est pas obligé, comme le suggère l'énoncé, de créer une fonction "ou exclusif" entre deux bits, que nous avons nommée dans cette correction ou_exclusif_bits
.
Version avec ==
def ou_exclusif_listes(liste_1, liste_2):
liste = []
for i in range(len(liste_1)):
if liste_1[i] == liste_2[i]:
liste.append(0)
else:
liste.append(1)
return liste
Version arithmétique
On remarque que :
- \(0+0=0\)
- \(0+1=1\)
- \(1+0=1\)
- \(1+1=2\) et donc \((1+1) \% 2 = 0\)
def ou_exclusif_listes(liste_1, liste_2):
return [(liste_1[i] + liste_2[i]) % 2 for i in range(len(liste_1))]
Version interdite
L'opérateur « ou exclusif » entre deux bits existe en Python : ^
.
Il était interdit dans cet exercice.
>>> 0 ^ 0
0
>>> 0 ^ 1
1
>>> 1 ^ 0
1
>>> 1 ^ 1
0
On aurait donc pu écrire de façon plus concise :
def ou_exclusif_listes(liste_1, liste_2):
return [(liste_1[i] ^ liste_2[i]) for i in range(len(liste_1))]
Approfondissement : l'opérateur ^
de Python opère bit à bit
Par exemple :
- \(7_{10}= 111_2\)
- \(9_{10}=1001_2\)
Réalisons le xor bit à bit :
0 | 1 | 1 | 1 | |
---|---|---|---|---|
xor | 1 | 0 | 0 | 1 |
= | 1 | 1 | 1 | 0 |
Or \(1110_2=14_{10}\)
>>> 7 ^ 9
14
Astuce
Vous pourrez écrire une fonction ou_exclusif_bits
qui prend en paramètres deux entiers égaux à 0 ou 1, et renvoie l'entier obtenu avec le ou exclusif appliqué à ces deux entiers.