как получить обратные значения из флага ORed

#c# #c #c #bitflags

#c# #c #c #битфлаги

Вопрос:

предположим, что я имею дело с CreateFileA

у меня есть

 Public Const GENERIC_ALL As Int32 = amp;H10000000
Public Const GENERIC_READ As Int32 = amp;H80000000
Public Const GENERIC_WRITE As Int32 = amp;H40000000
Public Const GENERIC_EXECUTE As Int32 = amp;H20000000
  

таким образом, это означает, что если мне нужно читать и писать, я бы сделал

 GENERIC_READ | GENERIC_WRITE = 0C0000000h
  

как бы API изменил эту операцию OR, чтобы узнать, какие флаги она содержит?, другими словами, предположим, что я получил это значение «0C0000000h», и мне нужно знать, какие обращения к нему содержатся, какие операции я должен выполнить с этим номером?

я хочу сказать, что если у меня около 100 флагов, и я их ORed / ANDed, то в итоге я получу какое-то сложное число, как я могу получить флаги, используемые для составления этого числа?

Комментарии:

1. Как правило, вы бы замаскировали нужный флаг.

2. GENERIC_READ | GENERIC_WRITE = 0C0000000h Что вы имеете в виду ?!? Это не будет работать ни на одном из языков, которые вы отметили ?!? Вы перепутали с GENERIC_READ | GENERIC_WRITE == 0C0000000h ?

3. «как бы API изменил эту операцию OR, чтобы узнать, какие флаги она содержит?» Логические и, скорее всего, операции: (flags amp; GENERIC_WRITE) > 0

4. Это похоже на Visual Basic, а не на C / C или C#

Ответ №1:

Двоичный файл И операция может использоваться для проверки отдельных битов (иначе флагов).

Например

 bool b = (value amp; GENERIC_READ) != 0;
  

вычисляется как true, если GENERIC_READ был включен в значение ранее, независимо от того, какие другие флаги были объединены.

Если это недостаточно хорошо объясняет это, то, возможно http://en.wikipedia.org/wiki/Bitwise_operation#AND это помогло бы.