Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Licence CC BY-NC-ND Thierry Parmentelat & Arnaud Legout Inria - UCA

Compléments - niveau avancé

Les compléments ci-dessous expliquent des fonctions évoluées sur les entiers. Les débutants en programmation peuvent sans souci sauter cette partie en cas de difficultés.

Opérations logiques : ET &, OU | et OU exclusif ^

Il est possible aussi de faire des opérations bit à bit sur les nombres entiers. Le plus simple est de penser à l’écriture du nombre en base 2.

Considérons par exemple deux entiers constants dans cet exercice

x49 = 49
y81 = 81

Ce qui nous donne comme décomposition binaire :

x49=49=32+16+1(0,1,1,0,0,0,1)y81=81=64+16+1(1,0,1,0,0,0,1)\begin{array}{rcccccc} x49 & = & 49 & = & 32 + 16 + 1 & \rightarrow &(0,1,1,0,0,0,1) \\ y81 & = & 81 & = & 64 + 16 + 1 & \rightarrow &(1,0,1,0,0,0,1) \end{array}

Pour comprendre comment passer de 32+16+132 + 16 + 1 à (0,1,1,0,0,0,1)(0,1,1,0,0,0,1) il suffit d’observer que :

32+16+1=026+125+124+023+022+021+12032 + 16 + 1 = \textbf{0}*2^6 + \textbf{1}*2^5 + \textbf{1}*2^4 + \textbf{0}*2^3 + \textbf{0}*2^2 + \textbf{0}*2^1 + \textbf{1}*2^0

ET logique : opérateur &

L’opération logique & va faire un et logique bit à bit entre les opérandes, ainsi

x49 & y81
17

Et en effet :

x49(0,1,1,0,0,0,1)y81(1,0,1,0,0,0,1)x49 & y81(0,0,1,0,0,0,1)16+117\begin{array}{rcl} x49 & \rightarrow & (0,1,1,0,0,0,1) \\ y81 & \rightarrow & (1,0,1,0,0,0,1) \\ x49\ \&\ y81 & \rightarrow & (0,0,1,0,0,0,1) \rightarrow 16 + 1 \rightarrow 17 \end{array}

OU logique : opérateur |

De même, l’opérateur logique | fait simplement un ou logique, comme ceci :

x49 | y81
113

On s’y retrouve parce que :

x49(0,1,1,0,0,0,1)y81(1,0,1,0,0,0,1)x49  y81(1,1,1,0,0,0,1)64+32+16+1113\begin{array}{rcl} x49 & \rightarrow & (0,1,1,0,0,0,1) \\ y81 & \rightarrow & (1,0,1,0,0,0,1) \\ x49\ |\ y81 & \rightarrow & (1,1,1,0,0,0,1) \rightarrow 64 + 32 + 16 + 1 \rightarrow 113 \end{array}

OU exclusif : opérateur ^

Enfin, on peut également faire la même opération à base de ou exclusif avec l’opérateur ^ :

x49 ^ y81
96

Je vous laisse le soin de décortiquer le calcul à titre d’exercice (le ou exclusif de deux bits est vrai si et seulement si exactement une des deux entrées est vraie).

Décalages

Un décalage à gauche de, par exemple, 4 positions, revient à décaler tout le champ de bits de 4 cases à gauche (les 4 nouveaux bits insérés sont toujours des 0). C’est donc équivalent à une multiplication par 24=162^4 = 16 :

x49 << 4
The history saving thread hit an unexpected error (OperationalError('attempt to write a readonly database')).History will not be written to the database.
784

x49(0,1,1,0,0,0,1)x49 << 4(0,1,1,0,0,0,1,0,0,0,0)512+256+16784\begin{array}{rcl} x49 & \rightarrow & (0,1,1,0,0,0,1) \\ x49\ <<\ 4 & \rightarrow & (0,1,1,0,0,0,1,0,0,0,0) \rightarrow 512 + 256 + 16 \rightarrow 784 \end{array}

De la même manière, le décalage à droite de nn revient à une division par 2n2^n (plus précisément, le quotient de la division) :

x49 >> 4
3

x49(0,1,1,0,0,0,1)x49 >> 4(0,0,0,0,0,1,1)2+13\begin{array}{rcl} x49 & \rightarrow & (0,1,1,0,0,0,1) \\ x49\ >>\ 4 & \rightarrow & (0,0,0,0,0,1,1) \rightarrow 2 + 1 \rightarrow 3 \end{array}

Une astuce

On peut utiliser la fonction built-in bin pour calculer la représentation binaire d’un entier. Attention, la valeur de retour est une chaîne de caractères de type str :

bin(x49)
'0b110001'

Dans l’autre sens, on peut aussi entrer un entier directement en base 2 comme ceci :

x49bis = 0b110001
x49bis == x49
True

Ici, comme on le voit, x49bis est bien un entier.

Pour en savoir plus

Section de la documentation Python.