Comment remplacer des bits dans un champ de bits sans affecter d'autres bits en utilisant c

Je voulais remplacer bits/bits(plus de 1) dans un 32/64 bits du champ de données sans affecter les autres bits.Dire par exemple:

J'ai un 64 bits registre où les bits 5&6 peut prendre des valeurs 0,1,2,3.

5:6    
0 0
0 1
1 0
1 1     

Maintenant, quand j'ai lu le registre je reçois dire la valeur 0x146(0001 0 10 0 0110).Maintenant, je veux changer la valeur à la position des bits 5 et 6 de 01.(maintenant, c'est 10, qui est de 2 en décimal et je veux le remplacer pour 1 e 01) sans autres bits d'être touché et écrire de nouveau le registre avec bits seulement 5&6 modifié.(il devenir 126 après le changement)

J'ai essayé de faire ce

reg_data=0x146
reg_data |= 1 << shift   (shift in this case is 5)

Si je fais cette valeur à peu les positions 5& 6 deviendra 11(0x3) et pas 01(0x1) qui je voulais.

  • Comment puis-je aller sur le faire lire/modifier/écrire?
  • Comment puis-je la remplacer uniquement certains bits/octets dans un 32/64 bits champs sans affecter l'ensemble des données du champ à l'aide de C?

Mettre un bit est ok, mais plus de un peu, je trouve ça un peu difficile.

Toutes les suggestions sont grandement appréciés.

source d'informationauteur Unicorn