c# 位运算符 '&' 和 'Enum.HasFlag' 的区别
c# Bit operators '&' and 'Enum.HasFlag' Difference
enum Type{
Monster = 1 << 0,
Human = 1 << 1,
Boss = 1 << 2,
}
Type unit = Type.Mosnter | Type.Boss;
Type eSearch = Type.Monster | Type.Human | Type.Boss;
Debug.Log((eSearch & unit) != 0); // True
Debug.Log(eSearch.HasFlag(unit)) // True
eSearch = Type.Monster | Type.Human;
Debug.Log((eSearch & unit) != 0); // True
Debug.Log(eSearch.HasFlag(unit)) // False
我想详细了解为什么使用上述代码时第一和第二个结果值不同
HasFlag 似乎做了一个完美的比较,所以请告诉我哪些位操作(例如'&')是内部操作。
Ps。我理解第一个和第二个“&”操作。
感谢您的阅读。
HasFlag
seems to make a perfect comparison
是的。它检查枚举值是否具有参数中存在的 all 个值。根据documentation,执行的位操作为:
thisInstance And flag = flag
换句话说,eSearch.HasFlag(unit)
等同于:
(eSearch & unit) == unit
它正在检查 AND 是否与 unit
完全相同,而不仅仅是非零。
旁注:您还应该将 [Flags]
属性添加到您的 Type
枚举中:
[Flags]
enum Type {
...
}
enum Type{
Monster = 1 << 0,
Human = 1 << 1,
Boss = 1 << 2,
}
Type unit = Type.Mosnter | Type.Boss;
Type eSearch = Type.Monster | Type.Human | Type.Boss;
Debug.Log((eSearch & unit) != 0); // True
Debug.Log(eSearch.HasFlag(unit)) // True
eSearch = Type.Monster | Type.Human;
Debug.Log((eSearch & unit) != 0); // True
Debug.Log(eSearch.HasFlag(unit)) // False
我想详细了解为什么使用上述代码时第一和第二个结果值不同
HasFlag 似乎做了一个完美的比较,所以请告诉我哪些位操作(例如'&')是内部操作。
Ps。我理解第一个和第二个“&”操作。
感谢您的阅读。
HasFlag
seems to make a perfect comparison
是的。它检查枚举值是否具有参数中存在的 all 个值。根据documentation,执行的位操作为:
thisInstance And flag = flag
换句话说,eSearch.HasFlag(unit)
等同于:
(eSearch & unit) == unit
它正在检查 AND 是否与 unit
完全相同,而不仅仅是非零。
旁注:您还应该将 [Flags]
属性添加到您的 Type
枚举中:
[Flags]
enum Type {
...
}