Sommaire
Source : Wikipédia
En logique, une opération bit à bit est un calcul manipulant les données directement au niveau des bits, selon une arithmétique booléenne. Elles sont utiles dès qu'il s'agit de manipuler les données à bas niveau : codages, couches basses du réseau (par exemple TCP/IP), cryptographie.
Les opérateurs élémentaires sont des opérations binaires réalisées simultanément sur l'ensemble des bits d'un mot de manière indépendante. Ainsi, la valeur du bit de rang n dans le résultat ne dépend que des valeurs des bits de même rang dans les opérandes d'entrée.
Chaque bit est inversé.
Exemple
N1 = 010011002 = 7610, N2 = 000011002 = 1210
S = N1 ET N2 = 000011002 (sur 8 bits, 7610 ET 1210 = 1210)
Exemple
N1 = 000010002 = 810, N2 = 010101012 = 8510
S = N1 OU N2 = 010111012 (sur 8 bits, 810 OU 8510 = 9310)
Exemple
N1 = 110010012 = 20110, N2 = 000011112 = 1510
S = N1 OU EXCLUSIF N2 = 110001102 (sur 8 bits, 20110 OU EXCLUSIF 1510 = 19810)
Les opérations ci-dessus peuvent être vérifiées avec la calculatrice Windows en mode programmeur.
L'unité arithmétique et logique (UAL, en anglais arithmetic–logic unit, ALU), est l'organe de l'ordinateur chargé d'effectuer les calculs. Le plus souvent, l'UAL est incluse dans l'unité centrale de traitement ou le microprocesseur.
Les UAL effectuent des opérations :
Exemple d'architecture matérielle : von Neumann
Python dispose d'opérateurs bit-à-bit (bitwise) qui agissent directement sur les nombres au niveau des bits.
Ces opérateurs sont au nombre de six :
# Exemple à tester
7&6
La fonction native (built-in) bin convertit un nombre entier en binaire dans une chaîne avec le préfixe 0b.
# Exemples à tester
print("bin(6) = ", bin(6))
#0b identifie la valeur qui suit comme étant un nombre binaire
print("bin(5 & 12) = bin(0b0101 & 0b1100)",bin(0b0101 & 0b1100))
Comme on le voit ci-dessus, Python n'affiche les bits d'un nombre binaire qu'à partir du premier bit non nul !!! |
Source: Numérique et sciences informatiques 1er- Ellipses
Ecrire un programme Python qui affiche la table d'une des opérations logiques (ET, OU, OU-EXCLUSIF) pour tous les entiers de n bits.
Pour l'opération ET bit à bit et n = 2, le programme doit afficher :
Remarque : on se limitera à n = 3 dans les tests.
Activité 1
Proposez un algorithme affichant uniquement les résultats d'une table ET pour n = 2 (valeurs en gras dans la table ci-dessus).
On demande quatre versions du programme. Celles-ci sont décrites dans les activités 2 à 5 ci-dessous.
Activité 2
La version 1 doit uniquement afficher les résultats de l'opération ET avec n=2.
Ressource : Les chaînes de caractères.
Résultat attendu
['0b0', '0b0', '0b0', '0b0']
['0b0', '0b1', '0b0', '0b1']
['0b0', '0b0', '0b10', '0b10']
['0b0', '0b1', '0b10', '0b11']
# Version 1
# A compléter
Activité 3
Dans la version 2 (à coder en reprenant la version 1), les nombres s'affichent avec n chiffres (opération ET, n=2)
Ressources : La méthode String zfill() et Les chaînes de caractères.
Résultat attendu
['00', '00', '00', '00']
['00', '01', '00', '01']
['00', '00', '10', '10']
['00', '01', '10', '11']
# Version 2
# A compléter
Activité 4
Dans sa version 3 (à coder en reprenant la version 2), le programme affiche une table ET de 3 bits et présente les valeurs à traiter sur la première ligne et la première colonne de la table.
Résultat attendu (partiel) pour n=3
['___', '000', '001', '010', '011', '100', '101', '110', '111']
['000', '000', '000', '000', '000', '000', '000', '000', '000']
['001', '000', '001', '000', '001', '000', '001', '000', '001']
['010', '000', '000', '010', '010', '000', '000', '010', '010']
etc.
# Version 3
# A compléter
Activité 5
Dans sa version 4 (à coder en reprenant la version 3), le programme traite les opérations ET, OU et OU-EXCLUSIF. Le choix de l'opération se fait à l'aide d'une variable operation.
Résultat attendu (partiel) pour n=3, l'opération est un OU-EXCLUSIF
OU-EXCLUSIF bit-à-bit
['___', '000', '001', '010', '011', '100', '101', '110', '111']
['000', '000', '001', '010', '011', '100', '101', '110', '111']
['001', '001', '000', '011', '010', '101', '100', '111', '110']
etc.
# Version 4
operation=2 # opération à traiter (0->&, 1->|, 2->^)
# A compléter