bonjour a tous,
j'ai un probleme a résoudre et j'ai besoin de votre aide
je vous explique j'aimerai transformer ce tableau booléen :
bool tab[10]={0,0,0,0,0,1,0,1,0,0};
en ce tableau booléen :
bool tab[10]={0,0,0,0,0,0,0,1,0,0};
en gros j'aimerai qui si mon tableau contient plusieurs valeur (true) alors mon tableau dois garder que le true qui est positionner au plus loin dans le tableau
Il suffit de parcourir le tableau à partir de la fin et de mettre toutes les valeurs à 0 à partir du momemt ou on a trouvé un 1.
bool trouve1=false;
for (int i=sizeof tab-1; i>=0; i--)
{
if (trouve1)
{
tab[i]=0; // on met à 0 tous le 1 après avoir trouvé le dernier
}
else
{
if (tab[i])
trouve1=true;
}
}
Oui, bien sur.
J'ai failli faire la remarque que les valeurs d'un booleen ce n'était pas 0 et 1, mais false et true. Mais je me suis adapté à la syntaxe du programme donné.
si votre tableau est toujours plus petit que 16/32/64 valeurs, vous pourriez prendre un uint16_t (entier non signé sur 16 bits ou version sur 32 ou 64 bits) et utiliser des bits pour représenter vos valeurs de vérité, par exemple
uint16_t valeurs = 0b0000010100;
avec les 0 qui disent faux et les 1 qui disent vrai. dans ce cas avec une petite fonction sympa du compilateur __builtin_clz() et un masque, on peut mettre à zero tous les bits après le premier 1 simplement
uint16_t valeurs = 0b0000010100;
void setup() {
Serial.begin(115200);
byte premier1 = 15 - __builtin_clz(valeurs); // 255 si pas de 1, sinon de 0 à 15 pour la position
Serial.print(F("avant: valeurs = 0b")); Serial.println(valeurs, BIN);
if (premier1 != 0xFF) valeurs &= ((uint16_t) 1) << premier1;
Serial.print(F("après: valeurs = 0b")); Serial.println(valeurs, BIN);
}
void loop() {}
On doit même pouvoir solutionner ça avec des calculs de logarithmes en base 2. Mais ça serait plus simple si les bits étaient rangés dans l'ordre inverse et qu'il fallait conserver le 1 le plus a gauche.
Si on a
uint16_t x = 0b0001000110010010
La petite entière du log en base 2 donne la position du 1 a conserver. Il suffit de faire pow (2, partie_entiere) pour obtenir le résultat