class CompteurNBits { 
/** 0 <= etat < 2n */ 
  private int etat = 0; 
  
/** 0 < n < 31 */ 
  private byte n; 
  
/** Constructeur qui permet seulement d'initialiser le nombre de bits. 
 * @param n nombre de bits pour coder l'état, 0 < valeur < 31 */ 
  CompteurNBits(byte n) { 
 	assert((n > 0) && (n <= 30)) : "0 < n < 31";  
  	this.n = n; 
  } 
 
 
 /** Constructeur qui permet d'initialiser le nombre de bits et l'état 
  * @param n nombre de bits pour coder l'état, 0 < n < 31 
  * @param etat valeur initiale de l'état, 0 <= etat < 2n  */ 
  CompteurNBits(int etat, byte n) { 
	this(n); // appel au premier constructeur qui initialise le champ n 
	assert((etat >= 0) && (etat < (1 << n)) : "0 <= etat < 2n";  
	this.etat = etat; 
  }
  
  /** @return la valeur courante de l'état */
  int getEtat() {
   	 return this.etat;
  }
   
  /** incremente rapidement
   *  @param nombre de pas d'incrémentation
   */
  void incrementer(int nombre) {
   	 for(int i = 0; i<nombre; i++) {
   	 	this.incrementer();
   	 }
  }
  
  void incrementer() {
   	 if (etat < ((1<<n) - 1)) { 
   	   // état inférieur stricte à 2^n-1 
   	   this.etat += 1; 
   	 } else { 
   	   // état égal à la valeur limite 2^n-1 
   	   this.etat = 0; 
   	 }
  }
}