[Resolu] test if

Bonjour à tous,

dans un bout de code je tombe sur:

uint8_t my7180::getAlgoStatus()
{
  I2Cdev::readByte(MY7180_ADDRESS, MY7180_AlgorithmStatus, &algoStatus);
  return algoStatus;
}

if (algoStatus & 0x01) Serial.println(F(" MY7180 standby status"));

Quelqu'un peut il m'expliquer la syntaxe du if avec & seul &?

Merci

Ça calcule le ET logique entre les deux valeurs (algoStatus et 1) et exécute l'instruction qui suit si le résultat est 1. Donc en gros, ça print si algoStatus est impair. On aurait pu écrire

if (algoStatus %2 == 1) Serial.println(F(" MY7180 standby status"));

Pas sur d'avoir tout compris!
algostatus est un int et après le &, j'ai un hex.
Il prend les deux valeurs, les convertit en binaire etil compare bit à bit?

Soit algostatus = 14 donc 1110 en binaire et 0x01 0001 en binaire,
il va renvoyer 0 puisque le bit 0 (de 14) et le bit 1 (de 0x01) donne 0 avec une condition &

Merci de ta réponse

C'est bien un ET bit à bit. Dans ton exemple, 14 est pair et le & renvoie 0. Avec 15, tu aurais 1111 & 0001 = 1 car 15 est impair.
Le & renvoie donc la parité de algoStatus (0 : pair, 1 : impair) aka le LSB (le bit le plus à droite).

Le test if va exécuter l'instruction qui suit si la résultat du test est 'true'. Mais 'true' c'est équivalent à 1. Donc si le résultat du & vaut 1, c'est à dire si algoStatus est impair, l'instruction print sera exécutée.

Je crois que j'ai compris
et si j'ai if (sensorStatus & 0x40) Serial.print(F("Gyro ID not recognized!"));
il compare avec le bit le plus à gauche ou MSB?

Si tu parles bien d'un mot de 8 bits, avec le MSB ce serait 0x80

40 en hexa vaut 1000000 en binaire, donc c'est le 7ème bit. Un int est codé sur 16 bits, donc ce n'est pas le plus à gauche, il est vers le milieu :slight_smile:

Damned: grillé par fdufnews ...

OK, merci j'ai tout compris!