1

コードの一部を理解しようとしていますが、これまでのところ理解できませんでした...

[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 として動作していると思いました。何が起こっているのか教えてください

4

4 に答える 4

4

手段を間違えている0x0x5は 16 と等しくなく、5 と等しくなります。16 進数を記述できるため、 = 10 0xと記述できます。0xA

定義を次のように変更します。

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

したがって、フラグを12表し、DewMiranda

于 2016-01-20T06:20:54.850 に答える
0

このトピックを読む必要があります。あなたのフラグは少し間違っています。例えば:

Pepsi | Cola = Miranda
 0001 | 0010 = 0011

論理的に正しいフラグ:

[Flags]
public enum Products
{
  Pepsi = 0x1,
  Coca = 0x2,
  Miranda = 0x4,
  Dew = 0x8,
  Wine = 0x0A 
} 
于 2016-01-20T06:22:59.173 に答える
0

理解するFlagsには、各フラグ値をバイナリ表現に変換することをお勧めします。したがって、あなたの場合は次のとおりです。

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

次に、12 (バイナリでは「1100」) がProductsenum にキャストされると、Dew のフラグ ビット (0100) がオン (またはバイナリでは 1) であることがはっきりとわかります。つまり、右から 3 番目のビットが 1 であるすべての製品には、Dew が含まれています。

于 2016-01-20T06:34:31.120 に答える