C/Masks de bits
Un article de Le wiki de 2 noisettes - noisette.ch.
Les masques de bits sont utilisés pour modifier ou isoler un sous-ensemble de bits.
Les bits notés 1 dans le masque sont les bits pour lequels on va modifier la valeur.
Un exemple en dira plus long :
value = 0x11110000 (=240) mask = 0x00000010 (=2)
Pour avoir la valeur du sous-ensemble de bits, on utilise un AND bits-à-bits et on shift à droite du nombre de bits à droite du dernier bit du mask :
if (value & mask) { ... }
Si au moins 1 des bits du sous-ensemble vaux 1 on va exécuter le block if.
Pour passer le sous-ensemble de bits (notés 1 dans le masque) à 1, on utilise un OR bits-à-bits :
value |= mask
En sortie, value = 0x11110010
Si on veut repasser (ou s'assurer) les bits à 0, on inverse le masque et on utilise un AND bits-à-bits :
var &= ~mask (=0x111111101)
En sortie, value = 0x11110000
Plus concrètement, si dev_ctrl est un pointeur vers les 8 bits du registre de contrôle d'un moteur par exemple, et que la doc nous dit :
* bit 0 : active le moteur à 1 * bit 1 : direction du moteur (0 colckwise, 1 counterclockwise) * bits 2-7 : vitesse du moteur
On définira donc 3 masques :
MOTOR_ENABLE = 1 (=0x00000001) MOTOR_DIR = 2 (=0x00000010) MOTOR_SPEED = 252 (=0x11111100)
Pour activer le moteur si il est désactivé, ou l'inverse :
if ( *dev_ctrl & MOTOR_ENABLE) {
// le moteur est activé, on le désactive
*dev_ctrl = *dev_ctrl & ~MOTOR_ENABLE
} else {
// le moteur est désactivé, on l'active
*dev_ctrl = *dev_ctrl | MOTOR_ENABLE
}
