You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用整数测试枚举值组合?求该技术名称与实现方法

位标志枚举的判断方法详解

嘿,你说的这种技术叫做位标志枚举(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}");
    }
}

额外小技巧:添加/移除枚举值

  • 添加某个方向:用|按位或操作,直接把对应位设为1
    combinationOfDirections |= (int)Directions.Right; // 把Right添加到组合中
    
  • 移除某个方向:用~取反后再做按位与,把对应位设为0
    combinationOfDirections &= ~(int)Directions.Left; // 从组合中移除Left
    

内容的提问来源于stack exchange,提问作者Zephni

火山引擎 最新活动