【发布时间】:2013-01-17 16:34:56
【问题描述】:
在学习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
(cont') IFF x = {ODD 字节值}
问题:什么是可以安全使用的完美标志值集?
【问题讨论】:
-
我认为在这种情况下你应该将其转换为 enum 以进行按位运算
-
在你的例子中, None 并不是一个真正的标志值(你不能用你拥有的逻辑来检查它)。您看到的 1 的“问题”只是二进制算术中 1 位的定义。
-
对于 C#,请参阅 System.FlagsAttribute。
-
IFF x contains any ODD byte values:当然可以。如果该值为奇数,则将设置第一位,因此设置读取位(根据您的定义)。如果您想知道是否only 设置了读取位,只需将您的值与PermissionTypes.Read进行比较。如果您想知道是否设置了读取位,无论设置了哪些其他位,请使用& mask = mask技巧。 -
@Roylee:您的标志值应该是 2 的幂。即1,2,4,8,16,32,... 任何其他值都将是这些标志的组合。例如,您可以创建一个值为 3 的
ReadAndWrite标志,但这将是Read和Write标志的组合。
标签: c# enums bit-manipulation flags