Systèmes Informatiques TD 3: langage C opérations élémentaires P. Bakowski bako@ieee.org
Opérateurs logiques/arithmétiques Le langage C offre une liste importante d opérateurs logiques et arithmétiques. P. Bakowski 2
Opérateurs logiques/arithmétiques Le langage C offre une liste importante d opérateurs logiques et arithmétiques. Ces opérateurs correspondent aux instruction disponibles dans les micro-processeurs processeurs. Complex/ omplex/reduced educed Instruction Set Computer P. Bakowski 3
Opérateurs logiques/arithmétiques Le langage C offre une liste importante d opérateurs logiques et arithmétiques. Ces opérateurs correspondent aux instruction disponibles dans les micro-processeurs. Les opérateurs logiques permettent d effectuer les opérations binaires/booléennes et les décalages logiques. P. Bakowski 4
Opérateurs logiques/arithmétiques Le langage C offre une liste importante d opérateurs logiques et arithmétiques. Ces opérateurs correspondent aux instruction disponibles dans les micro-processeurs. Les opérateurs logiques permettent d effectuer les opérations binaires/booléennes et les décalages logiques. Les opérateurs arithmétiques réalisent les traitements numériques en virgule fixe et en virgule flottante. P. Bakowski 5
Opérateurs logiques/arithmétiques Dans ce TD nous allons exploiter les opérateurs logiques afin de: traiter les champs binaires P. Bakowski 6
Opérateurs logiques/arithmétiques Dans ce TD nous allons exploiter les opérateurs logiques afin de: traiter les champs binaires construire les fonctions arithmétiques non- disponibles directement par le biais des opérateurs arithmétiques P. Bakowski 7
Opérateurs logiques/arithmétiques La liste des opérateurs binaires/booléennes est la suivante: - ou binaire (opération sur vecteur binaire) & - et binaire ~ - non binaire ^ - ou-exclusif binaire P. Bakowski 8
Opérateurs logiques/arithmétiques La liste des opérateurs binaires/booléennes booléennes est la suivante: - ou binaire (opération sur vecteur binaire) & - et binaire ~ - non binaire ^ - ou-exclusif binaire - ou booléen (opération sur valeur logique) && - et booléen! - non booléen P. Bakowski 9
Opérateurs logiques/arithmétiques Exemples: - ou binaire (opération sur vecteur binaire) - ou booléen (opération sur valeur logique) P. Bakowski 10
Opérateurs logiques/arithmétiques Exemples: - ou binaire (opération sur vecteur binaire) - ou booléen (opération sur valeur logique) unsigned char a=254; unsigned char b=17; unsigned char c,d; 11111110 00010001 P. Bakowski 11
Opérateurs logiques/arithmétiques Exemples: - ou binaire (opération sur vecteur binaire) - ou booléen (opération sur valeur logique) unsigned char a=254; unsigned char b=17; unsigned char c,d; c = a b ; // c=255 11111110 00010001 11111111 P. Bakowski 12
Opérateurs logiques/arithmétiques Exemples: - ou binaire (opération sur vecteur binaire) - ou booléen (opération sur valeur logique) unsigned char a=254; unsigned char b=17; unsigned char c,d; c = a b ; // c=255 d = a b ; // d=1 11111110 00010001 11111111 00000001 P. Bakowski 13
Opérateurs logiques/arithmétiques Exemples: & - et binaire (opération sur vecteur binaire) && - et booléen (opération sur valeur logique) P. Bakowski 14
Opérateurs logiques/arithmétiques Exemples: & - et binaire (opération sur vecteur binaire) && - et booléen (opération sur valeur logique) unsigned char a=254; unsigned char b=17; unsigned char c,d; 11111110 00010001 P. Bakowski 15
Opérateurs logiques/arithmétiques Exemples: & - et binaire (opération sur vecteur binaire) && - et booléen (opération sur valeur logique) unsigned char a=254; unsigned char b=17; unsigned char c,d; c = a&b ; // c=16 11111110 00010001 00010000 P. Bakowski 16
Opérateurs logiques/arithmétiques Exemples: & - et binaire (opération sur vecteur binaire) && - et booléen (opération sur valeur logique) unsigned char a=254; unsigned char b=17; unsigned char c,d; c = a&b ; // c=16 d = a&&b ; // d=1 11111110 00010001 00010000 00000001 P. Bakowski 17
Opérateurs logiques/arithmétiques Exemples: >>, << - décalage logique/binaire P. Bakowski 18
Opérateurs logiques/arithmétiques Exemples: >>, << - décalage logique/binaire unsigned char a=252; unsigned char c,d; c = a>>2 ; // c=63 11111100 00111111 P. Bakowski 19
Opérateurs logiques/arithmétiques Exemples: >>, << - décalage logique/binaire unsigned char a=252; unsigned char c,d; c = a>>2 ; // c=63 d = a<<5 ; // d=128 11111100 00111111 10000000 P. Bakowski 20
Opérateurs logiques/arithmétiques Exemples: >>, << - décalage arithmétique P. Bakowski 21
Opérateurs logiques/arithmétiques Exemples: >>, << - décalage arithmétique signed char a=-4; signed char c,d; c = a>>2 ; // c=-1 11111100 11111111 reproduction de 1 P. Bakowski 22
Opérateurs logiques/arithmétiques Exemples: >>, << - décalage arithmétique signed char a=-4; signed char c,d; c = a>>2 ; // c=-1 d = a<<2 ; // d=-16 11111100 11111111 11110000 P. Bakowski 23
Exercice 1 une fonction Exercice 1: déchiffrer la signification de la fonction ci-dessous: int f(int a,int b) { int r=1, a2=a, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>= >>=1); return r; } P. Bakowski 24
Exercice 1 une fonction int f(int a,int b) { int r=1, a2=a, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>=1); return r; } Prenons un int sur 4 bits: a= 0010; b=0011; P. Bakowski 25
Exercice 1 une fonction int f(int a,int b) { int r=1, a2=a, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>=1( b>>=1); return r; } Prenons un int sur 4 bits: a= 0010; b=0011; La boucle while fonctionne tant que b contient de 1 (22 pas: : 0001,0000) P. Bakowski 26
Exercice 1 une fonction int f(int a,int b) { int r=1, a2=a,, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>=1); return r; } premier pas: a= 0010 (2); b=0011 (3); P. Bakowski 27
Exercice 1 une fonction int f(int a,int b) { int r=1, a2=a, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>=1); return r; } premier pas: a= 0010 (2); b=0011 (3); b&masque => 1 (vrai( vrai) P. Bakowski 28
Exercice 1 une fonction int f(int a,int b) { int r=1, a2=a, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>=1); return r; } premier pas: a= 0010 (2);( b=0011 (3); b&masque => 1 (vrai) donc r= = 1*2 => 2; a2 => 2*2 => 4 P. Bakowski 29
Exercice 1 une fonction int f(int a,int b) { int r=1, a2=a, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>=1); return r; } premier pas: a= 0010 (2); b=0011 (3); b&masque => 1 (vrai) donc r= 1*2 => 2; a2 => 2*2 => 4 b>>1 donne 0001 deuxième pas P. Bakowski 30
Exercice 1 une fonction int f(int a,int b) { int r=1, a2=a, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>=1); return r; } deuxième pas: a= 0010 (2); b=0001 (1); P. Bakowski 31
Exercice 1 une fonction int f(int a,int b) { int r=1, a2=a, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>=1); return r; } deuxième pas: a= 0010 (2); b=0001 (1); b&masque => 1 (vrai( vrai) P. Bakowski 32
Exercice 1 une fonction int f(int a,int b) { int r=1, a2=a, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>=1); return r; } deuxième pas: a= 0010 (2); b=0001 (1); b&masque => 1 (vrai) donc r= 2*4 => 8; a2 => 8*8 => 64 P. Bakowski 33
Exercice 1 une fonction int f(int a,int b) { int r=1, a2=a, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>=1); return r; } deuxième pas: a= 0010 (2); b=0001 (1); b&masque => 1 (vrai) donc r= 2*4 => 8; a2 => 8*8 => 64 b>>1 donne 0000 => fin de boucle P. Bakowski 34
Exercice 1 une fonction int f(int a,int b) { int r=1, a2=a, masque=1; do { if(b&masque) r*=a2; a2 *= a2; } while (b>>=1); return r; } deuxième pas: a= 0010 (2); b=0001 (1); b&masque => 1 (vrai) donc r= 2*4 => 8; a2 => 8*8 => 64 b>>1 donne 0000 => fin de boucle return r donne 8 comme résultat (alors( alors?) P. Bakowski 35
Exercice 2 masque et décalage Exercice 2: Écrire une fonction type printb(val) qui affiche la valeur binaire d un entier (int val). P. Bakowski 36
Exercice 2 masque et décalage Exercice 2: Écrire une fonction type printb(val) qui affiche la valeur binaire d un entier (int val). Utiliser un masque et les opérateurs: & et >> P. Bakowski 37
Exercice 2 masque et décalage Exercice 2: Écrire une fonction type printb(val) qui affiche la valeur binaire d un entier (int val). Utiliser un masque et les opérateurs: & et >> Pour l affichage utiliser la fonction putchar(..) affiche un caractère ASCII P. Bakowski 38
Exercice 2 masque et décalage int printb(int a) { unsigned int masque=0x80000000; 0000000; 10000000 000000000000000 0000 000000000000000 P. Bakowski 39
Exercice 2 masque et décalage int printb(int a) { unsigned int masque=0x80000000; do { if(a&masque a&masque) ) putchar( 1 ); else putchar( 0 ); } while (masque>>=1( masque>>=1); premier pas: } 10000000 000000000000000 & a = -25 11111111 1111111111001111111111 111111111100111 affichage=> 1 P. Bakowski 40
Exercice 2 masque et décalage int printb(int a) { unsigned int masque=0x80000000; do { if(a&masque a&masque) ) putchar( 1 ); else putchar( 0 ); } while (masque>>=1( masque>>=1); deuxième pas: } 01000000 000000000000000000000 000000000000000 & a = -25 11111111 111111111100111111111 111111111100111 affichage=> 1 P. Bakowski 41
Exercice 2 masque et décalage int printb(int a) { unsigned int masque=0x80000000; do { if(a&masque a&masque) ) putchar( 1 ); else putchar( 0 ); } while (masque>>=1( masque>>=1); 32ème pas: } 0000000 0000000000000001 & a = -25 11111111 111111111100111 affichage=> 1 P. Bakowski 42
Exercice 3 - masque et décalage Exercice 3: Écrire une fonction type printb(val) qui affiche la valeur binaire d un nombre en virgule flottante (float val). P. Bakowski 43
Exercice 3 - masque et décalage Exercice 3: Écrire une fonction type printb(val) qui affiche la valeur binaire d un nombre en virgule flottante (float val). Utiliser un masque et les opérateurs: & et >> P. Bakowski 44
Exercice 3 - masque et décalage Exercice 3: Écrire une fonction type printb(val) qui affiche la valeur binaire d un nombre en virgule flottante (float val). Utiliser un masque et les opérateurs: & et >> Réfléchir sur le problème d incompatibilité entre les opérateurs et les types de données! P. Bakowski 45
Exercice 3 - masque et décalage Exercice 3: Écrire une fonction type printb(val) qui affiche la valeur binaire d un nombre en virgule flottante (float val). Utiliser un masque et les opérateurs: & et >> Réfléchir sur le problème d incompatibilité entre les opérateurs et les types de données! Comment contourner ce problème en C? P. Bakowski 46
Exercice 3 - masque et décalage Exercice 3: Écrire une fonction type printb(val) qui affiche la valeur binaire d un nombre en virgule flottante (float val). Utiliser un masque et les opérateurs: & et >> Réfléchir sur le problème d incompatibilité entre les opérateurs et les types de données! Comment contourner ce problème en C? Étudier la différence entre une structure et une union. P. Bakowski 47
Exercice 3 - masque et décalage int printb(float a) { unsigned int masque=0x80000000; union { float fa; unsigned int ia;} u; float fa unsigned int ia le même emplacement dans la mémoire: 4 octets P. Bakowski 48
Exercice 3 - masque et décalage int printb(float a) { unsigned int masque=0x80000000; union { float fa;unsigned int ia;} u; u.fa = a; a float fa le même emplacement unsigned int ia P. Bakowski 49
Exercice 3 - masque et décalage int printb(float a) { unsigned int masque=0x80000000; union { float fa;unsigned int ia;} u; u.fa = a; do { if(u.ia&masque u.ia&masque) ) putchar( 1 ); else putchar( 0 ); } while (masque>>=1); } float fa opération autorisée unsigned int ia P. Bakowski 50
Exercice 4 - multiplication Certains processeurs simples ne disposent pas des instructions de multiplication. RISC - pas de multiplication! P. Bakowski 51
Exercice 4 - multiplication Certains processeurs simples ne disposent pas des instructions de multiplication. Dans ce cas il faut réaliser les multiplications par le biais des opérateurs logiques et arithmétiques simples (addition et soustraction). mult(a,b) return p; P. Bakowski 52
Exercice 4 - multiplication Remarquons que l opération de puissance doit être toujours programmée par les opérations plus simples (multiplication) voir exercice 1 pow(a,b) a b => return r; P. Bakowski 53
Exercice 4 - multiplication Écrire une fonction qui multiplie deux valeurs a et b de type int. P. Bakowski 54
Exercice 4 - multiplication Écrire une fonction qui multiplie deux valeurs a et b de type int. int mult(a,b) {.. } P. Bakowski 55
Exercice 4 - multiplication Écrire une fonction qui multiplie deux valeurs a et b de type int. int mult(a,b) {.. } Utiliser exclusivement les opérateurs du décalage (>> >>) ) et de l addition (+)( P. Bakowski 56
Exercice 4 - multiplication int mult(int a,int b) { int p=0; int m=1; do { if(m&a) p+=b; b<<=1 } while (m<<=1); return p; } 000011 000101 000001 premier pas: m&a => true; ; p=101 (5); P. Bakowski 57
Exercice 4 - multiplication int mult(int a,int b) { int p=0; int m=1; do { if(m&a) p+=b; b<<=1 } while (m<<=1); return p; } 000011 000101 000001 premier pas: m&a => true; p=101 (5); b<<1 => 001010 (10) m<<1 => 000010 P. Bakowski 58
Exercice 4 - multiplication int mult(int a,int b) { int p=0; int m=1; do { if(m&a) p+=b; b<<=1 } while (m<<=1); return p; } 000011 001010 000010 deuxième pas: m&a => true; ; p=1111 (15); P. Bakowski 59
Exercice 4 - multiplication int mult(int a,int b) { int p=0; int m=1; do { if(m&a) p+=b; b<<=1 } while (m<<=1); return p; } 000011 001010 000010 deuxième pas: m&a => true; p=1111 (15); b<<1 => 010100 (20) m<<1 => 000100 P. Bakowski 60
Exercice 4 - multiplication int mult(int a,int b) { int p=0; int m=1; do { if(m&a) p+=b; b<<=1 } while (m<<=1); return p; } 000011 010100 000100 troisième pas : m&a => false; ; p=1111 (15); P. Bakowski 61
Exercice 4 - multiplication int mult(int a,int b) { int p=0; int m=1; do { if(m&a) p+=b; b<<=1 } while (m<<=1); return p; } 000011 010100 000100 troisième pas : m&a => false; p=1111 (15); b<<1 => 101000 (40) m<<1 => 001000 P. Bakowski 62
Exercice 4 - multiplication int mult(int a,int b) { int p=0; int m=1; do { if(m&a) p+=b; b<<=1 } while (m<<=1); return p; } 000011 101000 100000 dernier pas : m&a => false; ; p=1111 (15); P. Bakowski 63
Exercice 4 - multiplication int mult(int a,int b) { int p=0; int m=1; do { if(m&a) p+=b; b<<=1 } while (m<<=1); return p; } 000011 101000 100000 dernier pas : m&a => false; p=1111 (15); b<<1 => 100000 (64) m<<1 => 000000 => fin P. Bakowski 64
Exercice 4 - multiplication int mult(int a,int b) { int p=0; int m=1; do { if(m&a) p+=b; b<<=1 } while (m<<=1); return p; } 000011 101000 100000 dernier pas : m&a => false; p=1111 (15); b<<1 => 100000 (64) m<<1 => 000000 => fin return résultat = 15 P. Bakowski 65