C/Masks de bits

Un article de Le wiki de 2 noisettes - noisette.ch.

(Redirigé depuis Masks de bits)


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
}