Как работают | = и & =? - PullRequest
       49

Как работают | = и & =?

0 голосов
/ 18 июня 2011

Я хочу сделать перечисление таким образом, чтобы я мог & параметры после | ввода их.

Могу ли я просто сделать:

enum Things
{
   Something,
SomethingElse
};

Или я должен быть осторожен, чтобы дать им конкретные цифры, чтобы это работало?

Кроме того, если значение, например, 3, уже было | = 'd in, то | = снова привело бы к его неисправности (как, например, если (attribute & 3) больше не будет работать)

Спасибо

Ответы [ 5 ]

2 голосов
/ 18 июня 2011

Вы должны использовать специальные значения, а именно степени двух (1, 2, 4, 8, 16, ...).И вам, вероятно, следует прочитать это, прежде чем приступить к дальнейшему изучению «| & & feature»: http://en.wikipedia.org/wiki/Binary_numeral_system

Это также может стоить прочесть: http://en.wikipedia.org/wiki/Flag_(computing)

2 голосов
/ 18 июня 2011

Затем определите ваше перечисление как:

enum Things
{
   Something = 1       //0000 0001
   SomethingElse = 2;  //0000 0010
   SomethingX = 4;     //0000 0100
   SomethingY = 8;     //0000 1000
   SomethingZ = 16;    //0001 0000
};

По идее, только один бит в двоичном представлении должен быть 1, остальные должны быть 0, как показано в комментариях выше.Кроме того, я использовал только 8 битов в комментарии, это не означает, что значения перечисления имеют размер в один байт.Я использовал их только для удобства.Перечисляемые значения могут быть очень большими, могут содержать даже long.

1 голос
/ 18 июня 2011

Если вы хотите использовать побитовые операции с Enum, значения должны быть степенью 2. Это обычно называется Битовое поле .

1 голос
/ 18 июня 2011

Флажки упаковки с | и & работают лучше всего, когда вы используете преимущества двоичной кодировки компьютера.

Итак, используя степени 2 (здесь в десятичном представлении):

enum Things
{
   Something     = 1,
   SomethingElse = 2,
   SomethingMore = 4,
   SomethingHuge = 8
};

Это позволяет каждому флагу быть представленным исключительно одним битом целого числа, позволяя активировать и деактивировать каждый из них по отдельности.

В результате:

char x = 0;
x |=  Something;     // x in binary looks like 00000001
x |=  SomethingMore; // x in binary looks like 00001001
x &= ~Something;     // x in binary looks like 00001000

Я надеюсь, что это имеет смысл.

0 голосов
/ 18 июня 2011

Как сказал Наваз, вы можете сделать это проще, если используете шестнадцатеричные коды

enum Things
{
   Something =     0x00000001   //0000 0001
   SomethingElse = 0x00000002;  //0000 0010
   SomethingX    = 0x00000004;  //0000 0100
   SomethingY    = 0x00000008;  //0000 1000
   SomethingZ    = 0x00000010;  //0001 0000 // instead of 16
   SomethingZ2   = 0x00000020;  //0010 0000 // instead of 32
   SomethingZ3   = 0x00000040;  //0100 0000 // instead of 64
   SomethingZ4   = 0x00000080;  //1000 0000 // instead of 128
};

Или даже лучше использовать макрос:

#define BITMASK(x) (1<<(x))

enum Things
{
   Something =    BITMASK(0)   //0000 0001
   SomethingElse = BITMASK(1) ;  //0000 0010
   SomethingX    = BITMASK(2) ;  //0000 0100
   SomethingY    = BITMASK(3) ;  //0000 1000
   SomethingZ    = BITMASK(4) ;  //0001 0000 
};
...