在学习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 字节值}
问题:可以安全使用哪些完美的旗帜值?
答案 0 :(得分:6)
正如@antlersoft在评论中所说,你不能真正使用NONE
作为位标志。
其余的旗帜是有道理的。你需要使用2的幂来获得每个标志1位。
无论如何,测试“Has READ和NONE”设置是没有意义的,因为NONE意味着没有设置READ。
您使用X的奇数值描述的问题似乎没有意义。如果设置了位1,则该值仅为奇数。如果你一直使用你的标志,只有READ为真时才会设置第1位。
答案 1 :(得分:1)
x & PermissionTypes.Read
检查是否设置了值x
的最后一位,这本身就意味着没有找到任何内容。程序员可以用几种方式解释它:
x
通过Read
或x = 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