4

在学习这项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 = {字节值}


问题:可以安全使用的完美标志值集是什么?


参考: 这是完整的例子

4

2 回答 2

6

正如@antlersoft 在评论中所说,您不能真正NONE用作位标志。
其余的标志是有意义的。您确实需要使用 2 的幂来获得每个标志 1 位。

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

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

于 2013-01-17T16:41:49.067 回答
1

x & PermissionTypes.Read检查是否设置了值的最后一位,x这本身没有任何意义,就像您发现的那样。程序员可以用几种方式解释它:

  • xRead通过x = Reador设置了标志x = x | Read
  • x是奇数(或者更准确地说,除以 2^1 时得到余数 1),类似于x & 3- 除以 2^2 时的提醒。

代表单个位值的标志通常在您显示的示例中使用。由程序员决定分配给每个标志的含义。

标志使用的另一个示例 - 通过检查“符号”位检查传入的整数是否为负:

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

int x = -1;
var isNegative = ((StrangeFlags)x & StrangeFlags.Negative) != 0
于 2013-01-17T16:49:20.773 回答