Réglage d'un bit
Utilisez l'opérateur OU par bit ( |
) pour définir un bit.
number |= 1UL << n;
Cela fixera le n
ème partie de number
. n
doit être égal à zéro, si vous souhaitez définir l'option 1
et ainsi de suite jusqu'à n-1
si vous voulez régler le n
ement.
Utilice 1ULL
si number
est plus large que unsigned long
; la promotion de 1UL << n
ne se produit qu'après avoir évalué 1UL << n
où le comportement non défini consiste à décaler de plus de la largeur d'un long
. Il en va de même pour tous les autres exemples.
Dégager un peu
Utilisez l'opérateur ET binaire ( &
) pour effacer un bit.
number &= ~(1UL << n);
Cela permettra d'effacer les n
ème partie de number
. Vous devez inverser la chaîne de bits avec l'opérateur bitwise NOT ( ~
), puis ET.
Basculer un peu
L'opérateur XOR ( ^
) peut être utilisé pour basculer un bit.
number ^= 1UL << n;
Cela fera basculer le n
ème partie de number
.
Vérifier un peu
Tu n'as pas demandé ça, mais je pourrais tout aussi bien l'ajouter.
Pour vérifier un bit, décalez le nombre n vers la droite, puis effectuez un ET bit à bit :
bit = (number >> n) & 1U;
Cela mettra la valeur de la n
ème partie de number
dans la variable bit
.
Changer le n e bit à x
Définir le n
e bit à l'un ou l'autre 1
o 0
peut être réalisé avec ce qui suit sur une implémentation C++ à complément à 2 :
number ^= (-x ^ number) & (1UL << n);
Bit n
sera définie si x
es 1
et effacé si x
es 0
. Si x
a une autre valeur, vous obtenez des déchets. x = !!x
le rendra booléen à 0 ou 1.
Pour que cela soit indépendant du comportement de négation du complément à 2 (où -1
a tous les bits définis, contrairement à une implémentation C++ de complément à 1 ou de signe/magnitude), utilisez la négation non signée.
number ^= (-(unsigned long)x ^ number) & (1UL << n);
o
unsigned long newbit = !!x; // Also booleanize to force 0 or 1
number ^= (-newbit ^ number) & (1UL << n);
C'est généralement une bonne idée d'utiliser des types non signés pour la manipulation portable des bits.
o
number = (number & ~(1UL << n)) | (x << n);
(number & ~(1UL << n))
effacera le n
e bit et (x << n)
définira le n
e bit à x
.
C'est aussi une bonne idée de ne pas copier/coller le code en général et beaucoup de gens utilisent des macros de préprocesseur (telles que la réponse du wiki communautaire plus bas ) ou une sorte d'encapsulation.
90 votes
Lisez ça : graphiques.stanford.edu/~seander/bithacks.html et, quand tu auras maîtrisé ça, lis celui-là : realtimecollisiondetection.net/blog/?p=78
22 votes
Vous pourriez également être intéressé par le site The Bit Twiddler , Astuces pour la manipulation des bits y Les Algorithmes magiques agrégés .