Чтобы очистить один бит переменной, вы не используете *register |= 0 << bit
, а вместо этого *register &= ~(1 << bit)
. Если вы хотите управлять более чем одним битом, по сути, вам нужно стереть соответствующую часть, а затем перезаписать ее желаемым шаблоном.
Это, например, удалит биты с 4 по 6, а затем перезапишет их с содержимым value
:
*register &= 0x7 << 4
*register |= (value & 0x7) << 4;
Что касается вашего второго вопроса: никогда не пытайтесь запустить код, который пытается получить доступ к случайным ячейкам памяти, подобным этому, на P C. Это то, что вы делаете только для доступа к регистрам микроконтроллера. Ваш P C не имеет этих регистров, и даже если они есть, ваша операционная система все равно скрывает от вас фактическую физическую память.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:
Как как указал Лундин, использование битовых полей зависит от компилятора / архитектуры и, следовательно, непереносимо. Если вы хотите их использовать, вам нужно будет проверить документацию вашего компилятора, чтобы убедиться, что они работают должным образом. В случае сомнений предпочтите решение, указанное выше. Продолжайте читать на свой страх и риск; -)
С учетом этого, вы также можете сделать, чтобы избежать манипуляции с битами, примерно так:
union
{
struct
{
uint32_t vectreset :1;
uint32_t vectclractive :1;
uint32_t sysresetreq :1;
uint32_t :5;
uint32_t prigroup :3;
uint32_t :4;
uint32_t endianness :1;
uint32_t vectkey :0;
};
uint32_t u32;
} *aircr = (void*)0xFA050000;
И затем в вашем коде получите доступ к битовому полю следующим образом: (*aircr).vectkey = 0x5FA;