如何用整数测试枚举值组合?求该技术名称与实现方法
位标志枚举的判断方法详解
嘿,你说的这种技术叫做位标志枚举(Bitwise Flags Enum),完全就是靠位运算来实现组合判断的,我来给你拆解清楚怎么用:
先给你的枚举补个小优化(可选但推荐)
虽然你现在的枚举定义能正常工作,但给它加上[Flags]特性会更规范,还能让后续的ToString()输出更直观,比如:
[Flags] public enum Directions { Top = 1, // 二进制 0001 Right = 2, // 二进制 0010 Bottom = 4, // 二进制 0100 Left = 8 // 二进制 1000 }
每个值都是2的幂,对应二进制里的单独一位,这样多个值组合时,每个位就代表是否包含该方向,这也是你能通过1-15生成所有组合的原因。
判断整数是否包含某个枚举值的核心方法
你记的&操作符就是关键!我们用按位与操作来检查目标位是否被设置:当组合值和某个枚举值的整数形式做按位与时,如果结果不等于0,就说明这个枚举值被包含在组合里。
举个具体的例子,判断combinationOfDirections是否包含Directions.Bottom:
int combinationOfDirections = Random.Range(1, 15); bool hasBottom = (combinationOfDirections & (int)Directions.Bottom) != 0;
扩展:一次性找出所有包含的方向
如果想遍历所有可能的方向,找出组合里包含的所有项,可以这么写:
foreach (Directions dir in Enum.GetValues(typeof(Directions))) { if ((combinationOfDirections & (int)dir) != 0) { Console.WriteLine($"当前组合包含方向:{dir}"); } }
额外小技巧:添加/移除枚举值
- 添加某个方向:用
|按位或操作,直接把对应位设为1combinationOfDirections |= (int)Directions.Right; // 把Right添加到组合中 - 移除某个方向:用
~取反后再做按位与,把对应位设为0combinationOfDirections &= ~(int)Directions.Left; // 从组合中移除Left
内容的提问来源于stack exchange,提问作者Zephni




