Retrouver quel bit est a 1 sans Log

Bonjour,

Je cherche une operation qui me permettrai de retrouver quel bit est a 1 dans un octet sans utiliser la fonction log
Par exemple si j'ai:

B00010000 comment savoir que le bit 5 est a 1 sans faire :

B00010000 = 16
x = log16/log2

mais en utilisant les operations binaires.

merci pour votre aide

on utilise l'operateur & (attention pas && !!!)

si on veut tester B00010000 et savoir quelle est la valeur du bit 5 on fait :

if (B00010000 & 16)
{
Serial.println("Le bit 5 est a 1");
}
else
{
Serial.println("Le bit 5 est a 0");
}

de même si on veux (par exemple) tester sur une valeur val si les 3 derniers bits sont à 1 on écrira :

if (val & 7)
{
Serial.println("Les bits 0, 1, 2 sont a 1");
}
else
{
Serial.println("un des bits 0, 1, 2 est a 0");
}

En esperant que cela t'aide.

Pour info je prefere compter les bit à partir de 0. Cela correspond à l'exposant. Example le 4 eme bit vaut 2 puissance 4 soit 16.

Le premier bit vaut 2 puissance 0 soit 1.

Une solution serait peut-être d'utiliser les fonctions de décalage, en comptant le nbre de décalages nécessaires ... mais il y a sans doute mieux :roll_eyes:

tu décales à droite tant que le résultat est différent de 0

Bonjour,

La fontion bitRead serait la plus adaptée non ?

http://www.arduino.cc/en/Reference/BitRead

Merci pour toutes vos reponses

J'ai essayer comme cela :

for (int i =0; i< 8; i++){
x = x >>i;
if ( x & 1){
SelectPattern = i;
}

x est le nombre binaire dont je veux savoir quel bit est a 1 mais ca ne marche pas j'ai un decalage
en sachant que dans mon programme seul un Bit sera a 1 a la fois

En ce qui concerne BitRead la fonction ne retourne pas le numero du bit qui est a 1 il faut lui donner le Numero du bit a lire.

C'est parce que x = x >> i fout le bordel.

je te donne un code qui fonctionne :

void disp(int x)
{
 for (int i =0; i< 8; i++)
 {
     int a;
     
     a = x >> i;

     Serial.print("le bit");
     Serial.print(i, DEC);
     if ( a & 1)
       Serial.println(" est a 1");
     else
       Serial.println(" est a 0");
 }
}

Essaye avec disp(170) qui vaut : B10101010

A+

Merci Grag38

cela fonctionne parfaitement

Le hic avec le log c'est que si ton octet contient plus qu'un 1, ça ne marchera pas.

V'la un petit exemple qui sert à lire l'octet lié à une table de bouton.

  touches = module.obtenir_la_table_des_boutons();
  
  for (int touche_actuelle = 0; touche_actuelle < 8; touche_actuelle++)  {
    
    if(bitRead (touches, touche_actuelle)==1){
    
      Serial.println(touche_actuelle);      
      module.configurer_la_del(VERTE, touche_actuelle);
    
    }
    
    else{module.configurer_la_del(ROUGE, touche_actuelle);}
  
  }

Ça c'est à l'épreuve des balles. Cependant, la méthode à Grag est excellente également. En fait, si on reproduisait les deux méthodes en circuit réelle avec des puces 74**XX, ça prendrait le même nombre de puces, juste pas les mêmes...

Pour trouver le premier bit à 1 en partant du bit de poids faible :

byte whereIsMyBit(byte in) {
  byte n = 0;
  while(!(in & 1) && n < 8) {
    in >>= 1;
	++n;
  }
  return n;
}

Cette fonction te retourneras l'indice du bit à 1, ou 8 si aucun bit n'est à 1.