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 {
    ...
}