Как заменить биты в битовом поле, не затрагивая другие биты с помощью c

Я хотел заменить бит/биты (более 1) в 32/64-битном поле данных, не затрагивая другие биты.Скажем, например:

У меня есть 64-битный регистр, где биты 5 и 6 могут принимать значения 0,1,2,3.

5:6    
0 0
0 1
1 0
1 1     

Когда я читаю регистр, я получаю значение 0x146(0001 0 10 0 0110).Теперь я хочу изменить значение в битовой позиции 5 и 6 на 01. (сейчас это 10, что равно 2 в десятичной системе счисления, и я хочу заменить его на 1 e 01) без изменения других битов и записать обратно регистр с измененными только битами 5 и 6. (так что после изменения он становится 126)

Я пробовал сделать это

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

Если я сделаю это, значение в битовых позициях 5 и 6 станет 11(0x3), а не 01(0x1), как я хотел.

  • Как мне сделать чтение/изменение/запись?
  • Как заменить только определенный бит/биты в 32/64-битном поле, не затрагивая все данные поля, используя C?

Установка бита - это нормально, но более одного бита - это для меня сложно.

Любые предложения будут высоко оценены.

17
задан John Flatness 7 May 2011 в 18:22
поделиться