Pas de dépendances
#include <stdio.h> void printbin(unsigned char n) { int i; for(i=sizeof(unsigned char)*8-1;i>=0;i--) printf("%d",((n>>i)&1)); printf("\n"); } int main() { unsigned char n=1; printbin(n); n=n<<3; printbin(n); n=n>>1; printbin(n); n=~n; printbin(n); n=n&7; printbin(n); n=n^7; printbin(n); n=n|133; printbin(n); return 0; }
Ce tutorial est pour ceux qui sont habitués au binaire.
Si vous ne savez pas exactement comment ça marche, vous risquez d'etre largué.
Dans un octet, il y a 8 bits.
En général, on utilise une variable comme un nombre entier.
Ce tutorial permet de placer des bits la ou on veut dans un octet : manipulation au niveau du bit.
Utiliser ce genre d'opérateurs est fait pour optimiser la mémoire, et/ou la vitesse, ainsi que
dans les algorithmes de compression.
Donc cela s'adresse déja a des programmeurs confirmés.
La fonction printbin écrit n en binaire. En lisant la suite, vous pourrez la décortiquer a votre
aise.
Mais l'essentiel est dans le main.
je définis n=1
en binaire, sous 8 bits, ça s'écrit :
00000001
Les opérateurs << et >>
***********************
J'utilise ensuite l'opétateur << (appelé aussi SHL = SHIFT LEFT)
qui sert a décaler tous les bits a gauche !!
avec 3, ça donne un décalage de 3 cases pour tout le monde a gauche :
00001000
<---
La meme chose avec l'opérateur >> (appelé aussi SHR = SHIFT RIGHT)
avec 1 ici :
00000100
->
Note : les bits qui sortent a gauche ou a droite sont perdus. Les nouveaux bits apparus sont des 0.
Note : les opérateurs ROL et ROR qui permettent d'éviter cela par une Rotation ciruclaire des bits
ne sont pas définis comme natifs en C ou en C++.
Cela dit, rien n'empeche de passer en assembleur inline pour cela :
int n=1;
_asm
{
MOV AX,n
ROR n,3
MOV n,AX
}
Astuce :
Multiplier par 2 revient a décaler les bits a gauche une fois.
Diviser par 2 revient a décaler les bits a droite une fois.
donc :
a=n*2(puissance)i; <=> a= n << i;
L'opérateur ~
*************
L'opérateur NOT bit a bit :
Change tous les bits :
On avait
00000100
donc on trouve :
11111011
L'opérateur &
*************
L'opérateur AND (ou ET bit a bit)
Compare 2 nombres bit par bit, et met un 1 UNIQUEMENT si les 2 sont a 1. 0 sinon.
7 = 00000111
n = 11111011
------------
& = 00000011
L'opérateur ^
*************
L'opérateur XOR (OU EXCLUSIF)
Compare 2 nombres bit par bit, et met un 1 si l'un OU l'autre est a 1. Mais PAS les 2.
7 = 00000111
n = 00000011
------------
^ = 00000100
L'opérateur |
*************
L'opérateur OR (OU INCLUSIF)
Compare 2 nombres bit par bit, et met un 1 si l'un OU l'autre ou les 2 est a 1.
133 = 10000101
n = 00000100
------------
| = 10000101
Note : Tous ces opérateurs sont des opérateurs de tres bas niveau : c'est a dire que c'est quelque chose
de tres tres rapide pour un ordinateur. Ce sont les opérateurs les plus rapides.
