Programmation C++

Master M2 Informatique --- Feuille n° 3

Résumé:

On se propose dans ce TD de manipuler des masques de bits calculés à la compilation. Les entiers (non signés) seront assimilés à des tableaux de bits dont la première case est le bit de poids faible.

On peut en C++ définir une classe paramétrée par des entiers et spécialiser cette classe pour certaines valeurs:

template<unsigned N>
struct Fibonacci{
  static const unsigned res= Fibonacci<N-1>::res + Fibonacci<N-2>::res;
};

template<>
struct Fibonacci<1>{
  static const unsigned res=1;
};


template<>
struct Fibonacci<0>{
  static const unsigned res=0;
};
Noter que si la classe a plusieurs paramètres, on peut ne spécialiser que selon l'un d'entre eux. Pour des valeurs données, c'est toujours la classe qui a le moins de paramètres libres qui sera choisie.


Exercice n° 1

Écrire une classe template IntervalMask telle que IntervalMask<Begin,Size>::val est l'entier dont Size bits à partir du bit Begin valent 1. Par exemple, la valeur décimale de IntervalMask<3,4>::val est 120.

Exercice n° 2

Écrire une classe template BinInfo paramétrée par un entier N et qui contient trois constantes:

Exercice n° 3

On désire calculer tous les masques sur les N premiers bits dont exactement K bits valent 1. L'algorithme suivant permet d'énumérer les masques qui ont cette propriété. Écrire une classe Next paramétrée par un masque M et qui calcule le masque qui suit M.

Exercice n° 4

Justifier que le nombre de masques sur les N premiers bits dont exactement K bits valent 1 est égal à binomial(n,k). On rappelle que binomial(n,k) est calculable récursivement; Écrire la classe Binomial de sorte que Binomial<N,K>::val est une constante égale à binomial(n,k).

Exercice n° 5

Écrire la classe ArrayMask de sorte que ArrayMasque<N,K,I>::val soit le I-ème masque ayant K bits à 1 parmi les N premiers. Si I est trop grand, cette valeur devra être nulle.

Exercice n° 6

Écrire une fonction template print telle que print<M,N>() affiche les N premiers bits de M. Écrire une classe template For de sorte que For<I,J,K,N>::print() affiche tous les masques ayant K bits à 1 parmi les N premiers du I-ème masque jusqu'au J-ème.