Как использовать битовые маски, чтобы разрешить / запретить манипулирование определенными битами - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть 32-битное значение, которое представляет 32 отдельных состояния. У меня также есть другое 32-битное значение, которое контролирует, какие биты либо заблокированы, либо могут быть изменены приложением.

Например (для краткости используется 4-битная маска)

Example 1
Value          1010
Lock Mask      1000 - i.e. the 4th bit is locked, i.e. can't be altered
Incoming value 0100
New Result     1100 - 4th bit unchanged

Example 2
Value          0011
Lock Mask      1000 - i.e. the 4th bit is locked, i.e. can't be altered
Incoming value 1100
New Result     0100 - 4th bit unchanged

Может кто-топожалуйста, объясните, как я мог достичь этого. Может быть, мне нужно изменить маску, чтобы она показывала биты, которые можно изменить, например, 0111 в приведенном выше примере ... Я не знаю.

С уважением, Марк.

1 Ответ

1 голос
/ 11 ноября 2019

Предполагается, что C-подобный язык, где & - поразрядно;| - побитовый или;и ~ является побитовым дополнением:

new_value = (value & locked) | (incoming & ~locked);

Вы можете использовать + вместо |, если считаете, что оно более читабельно.

...