Dans les exercices suivants, nous allons essayer de réduire l'utilisation de conditions et de boucles pour optimiser nos programmes. Cela vous aidera également à comprendre et manipuler les opérateurs unaire et binaire. Dans la suite, nous considérerons une architecture 64 bits en big endian (les bits de poids fort sont les plus à gauche) avec des entiers 32 bits.
Calculer le signe d'un nombre entier
Écrivez une fonction qui retourne -1 si le nombre est négatif, 0 si le nombre est zéro, et +1 si le nombre est positif. Vous pouvez proposer une première version utilisant des conditions. Ensuite, essayez de créer des opérations mathématiques ou un masque binaire permettant de trouver le signe.
#include <stdio.h>
int sign(int n) {
// Implémentez la fonction ici
return 0;
}
int main() {
int num = -5; // Exemple
printf("Le signe de %d est %d\n", num, sign(num));
return 0;
}
Questions supplémentaires :
- Quel mot-clé ou méthode pourrait être utilisé pour optimiser l'appel de cette fonction ?
- Quelle est la représentation de -1 en binaire ?
- Quelle est la représentation de -x en binaire ?
- Que fait l'opération
8 >> 2
? - Entre ces deux opérations, laquelle est la plus rapide ? (a)
pow(2, x)
et (b)1 << x
Modifier le bit de signe
Ajoutez une fonction dans le programme précédent qui retourne la valeur absolue de son paramètre (int). Proposez une première approche basique utilisant des conditions, puis cherchez une formule mathématique utilisant les masques binaires pour modifier la représentation.
Compter le nombre de bits
Écrivez un programme C qui compte le nombre de bits à 1 dans un entier. Par exemple, l'entier 2 donnera 1 bit positif, tandis que l'entier 3 en donnera 2 bits positifs. Proposez une approche basique utilisant une boucle.
#include <stdio.h>
unsigned int count_bits(unsigned int n) {
// Fonction pour compter le nombre de bits à 1
// Implémentez la fonction ici
}
int main() {
unsigned int num = 0xFF; // Exemple
printf("Le nombre de bits à 1 dans %u est %u\n", num, count_bits(num));
return 0;
}
Questions supplémentaires :
- Combien de bits à 1 a l'entier -1, en 32 bits ?
- Combien de bits à 1 a l'entier -1, en 8 bits ?
- Peut-on imaginer une version plus rapide ? Si oui, comment ?
- Conseil : utilisez des hexadécimaux comme
0xFF
Entrelacement d'entiers
Écrivez un programme et une fonction qui entrelacent deux entiers 32 bits et écrivent le résultat dans un entier 64 bits. Proposez une première version simple utilisant une boucle. Par exemple, en considérant deux entiers x=0b010101
et y=0b101010
, cela devrait afficher 0b100110011001
.
#include <stdio.h>
long long interlace(unsigned int x, unsigned int y) {
// Implémentez la fonction ici
return 0;
}
int main() {
unsigned int x = 0b010101;
unsigned int y = 0b101010;
printf("L'entrelacement de %b et %b est %llb\n", x, y, interlace(x, y));
return 0;
}