2016-01-20 2 views
0

Я пытаюсь понять часть кода, но не мог понять его до сих пор ...не могли понять Enum Флаги с 0x2 значения

[Flags] 
public enum Products 
{ 
    Pepsi = 0x1, 
    Coca = 0x2, 
    Miranda = 0x3, 
    Dew = 0x4, 
    Wine = 0x5 
} 


Products pp = (Products)12; 
pp.HasFlag(Products.Dew); ==> True 
pp.HasFlag(Products.Miranda); ==> False 
pp.HasFlag(Products.Coca); ==> False 

Я хочу знать, почему pp.HasFlag(Products.Dew) является True и pp.HasFlag(Products.Miranda) является False. Я думал, что он работает как 0x1 = 1, 0x2 = 2, 0x3 = 4, 0x4 = 8, 0x5 = 16. Пожалуйста, расскажите мне, что происходит

+0

Я не вижу причин, чтобы downvote этот вопрос. По крайней мере, не из-за причины ... – nozzleman

ответ

1

Ваша первоначальная декларация равна

[Flags] 
public enum Products 
{ 
    Pepsi = 0x1, 
    Coca = 0x2, 
    Miranda = Coca | Pepsi, // equals to 0x3 since 0x3 == 0x2 | 0x1 
    Dew = 0x4, 
    Wine = Dew | Pepsi  // equals to 0x5 since 0x5 == 0x4 | 0x1 
} 

Вы, вероятно, хотите

[Flags] 
public enum Products 
{ 
    Pepsi = 0x1, 
    Coca = 0x2, 
    Miranda = 0x4, 
    Dew = 0x8, 
    Wine = 0x10 
} 
4

Вы ошибаетесь в отношении 0x означает. 0x5 не равно 16, он равен 5. 0x позволяет писать шестнадцатеричной, так что вы могли бы написать 0xA = 10.

Изменить ваше определение будет:

public enum Products 
{ 
    Pepsi = 1, 
    Coca = 2, 
    Miranda = 4, 
    Dew = 8, 
    Wine = 16 
} 

Таким образом, 12 будет представлять флаг Dew и Miranda

+0

HasFlag (Products.Dew) - правда? –

+2

@WaqarAhmed Да, потому что '12' представляет' 8 + 4' (это Роса и Миранда). – Rob

+0

В соответствии с моим кодом Почему pp.HasFlag (Products.Dew) является True и pp.HasFlag (Products.Miranda) является ложным? –

0

Вы должны прочитать this topic. Ваши флаги немного неправильны. Например:

Pepsi | Cola = Miranda 
0001 | 0010 = 0011 

Логически правильные флаги:

[Flags] 
public enum Products 
{ 
    Pepsi = 0x1, 
    Coca = 0x2, 
    Miranda = 0x4, 
    Dew = 0x8, 
    Wine = 0x0A 
} 
0

Для того, чтобы понять Flags лучше преобразовать каждое значение флага к его двоичному представлению. Так что в вашем случае мы имеем:

[Flags] 
public enum Products 
{ 
    Pepsi = 0x1, //--> 0001 
    Coca = 0x2, //--> 0010 
    Miranda = 0x3, //--> 0011 
    Dew = 0x4, //--> 0100 
    Wine = 0x5 // --> 0101 
} 

тогда, когда 12 (что в двоичном виде «1100») отливают в Products перечислении вы можете ясно видеть, что битовый флаг для Dew (который 0100) находится на (или 1 в двоичном формате). Другими словами, каждый продукт, у которого третий бит справа - 1, имеет в нем Dew.

 Смежные вопросы

  • Нет связанных вопросов^_^