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

Roy*_*Lee 4 c# enums flags bit-manipulation

在学习这项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
    }
Run Code Online (Sandbox Code Playgroud)

要检查hasFlag属性:

if((value & mask) == mask) {...}
Run Code Online (Sandbox Code Playgroud)

但是当'hasFlag'应用于'None'和'Read'时:

Denote x = Current_Permission_Setting,

x & PermissionTypes.None = always false
x & PermissionTypes.Read = always true IFF 
Run Code Online (Sandbox Code Playgroud)

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


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


参考: 这是完整的例子.

ASh*_*lly 6

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

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

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

  • @Roylee:在枚举中使用值"0"的"None"是一个好习惯,以便能够清除变量:`permission = PermissionTypes.None;`.关键是你不能像旗子那样测试它.只需测试`permission == PermissionTypes.None`.并且标志值总是具有值1,2,4,8,16,32 ......这些是2的幂(2 ^ 0 = 1,2 ^ 1 = 2,2 ^ 2 = 4 ...).它与偶数和奇数无关. (2认同)