最佳标志值(提示和良好实践)

时间:2013-01-17 16:34:56

标签: c# enums bit-manipulation flags

在学习flag技术的同时,我遇到了一些问题,因此我在使用C#展示了这个例子:Enum:

   [Flags]
    enum PermissionTypes : byte
    {
        None = 0x0,
        Read = 0x1,
        Write = 0x2,
        Modify = 0x4,
        Delete = 0x8,
        Create = 0x10,
        All = Read | Write | Modify | Delete | Create
    }

检查hasFlag属性:

if((value & mask) == mask) {...}

但是'hasFlag'同时适用于'None'和'Read':

Denote x = Current_Permission_Setting,

x & PermissionTypes.None = always false
x & PermissionTypes.Read = always true IFF 

(续)IFF x = { ODD 字节值}


问题:可以安全使用哪些完美的旗帜值?


参考:  Here's the full example

2 个答案:

答案 0 :(得分:6)

正如@antlersoft在评论中所说,你不能真正使用NONE作为位标志。
其余的旗帜是有道理的。你需要使用2的幂来获得每个标志1位。

无论如何,测试“Has READ和NONE”设置是没有意义的,因为NONE意味着没有设置READ。

您使用X的奇数值描述的问题似乎没有意义。如果设置了位1,则该值仅为奇数。如果你一直使用你的标志,只有READ为真时才会设置第1位。

答案 1 :(得分:1)

x & PermissionTypes.Read检查是否设置了值x的最后一位,这本身就意味着没有找到任何内容。程序员可以用几种方式解释它:

  • x通过Readx = Read设置了x = x | Read个标记。
  • x是奇数(或者更准确地说,当除以2 ^ 1时给出余数1),类似于x & 3 - 除以2 ^ 2时的提醒。

表示各个位值的标志通常用于您显示的样本中。由程序员决定分配给每个标志的含义。

标志使用的另一个示例 - 通过选中“sign”位来检查是否以整数传递为负:

[Flags]
enum StrangeFlags : uint {
    Negative = 0x80000000,
}

int x = -1;
var isNegative = ((StrangeFlags)x & StrangeFlags.Negative) != 0