Цепные логические флаги - как они называются? - PullRequest
2 голосов
/ 23 октября 2019

Фреймворки, которые я видел ранее, позволяют передавать цепочку из нескольких констант через один параметр, такой как: Итак, я считаю:

foo(FLAG_A | FLAG_B | FLAG_C);

Они действуют как логические значения, поэтому функция знает, какие флаги были заданы.

Теперь я хочу реализовать нечто подобное.

Как называется эта концепция?

Ответы [ 3 ]

0 голосов
/ 23 октября 2019

В .Net они определяются enum с использованием FlagsAttribute:

[Flags()]
public enum Foo
{
     Bit1 = 1,
     Bit2 = 2,
     Bit4 = 4,
     Bit8 = 8,
     etc.
 }

// Or define using explicit binary syntax
[Flags()]
public enum Foo
{
     Bit1 = 0b_0000_0001,
     Bit2 = 0b_0000_0010,
     Bit4 = 0b_0000_0100,
     Bit8 = 0b_0000_,
     etc.
 }

И для использования:

SomeFunction(Foo.Bit1 | Foo.Bit4 | etc);

Я бы предложил, чтобы ваше текущее имя ( Flags ) представляется наиболее подходящим определением, по крайней мере, в этом контексте.

0 голосов
/ 23 октября 2019

Очевидно, что "флаги и битовые маски" являются правильными ключевыми словами, чтобы узнать больше об этом. «Флаги» одни не раньше. Тем не менее, большое спасибо за разъяснения!

0 голосов
/ 23 октября 2019

Это основано на двоичном ORing. Обычно каждая из символьных констант будет представлять собой один отдельный бит, например, как в:

enum {
   FLAG_A = 1,
   FLAG_B = 1<<1,
   FLAG_C = 1<<2,
};

, чтобы вы могли сложить их вместе с |, проверить для каждого отдельного с &и вычтите два таких набора флагов с помощью & ~.

...