You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据组合值res_flags判断枚举animals中哪些选项已勾选

解决方法

首先要注意,你当前定义的animals枚举不适合用于位掩码操作——因为枚举值不是2的整数次幂(比如Mouse=3等于Cat|Dog的结果),这会导致不同的勾选组合得到相同的res_flags,无法准确区分哪些复选框被勾选。正确的做法是给枚举加上[Flags]特性,并将每个成员的值设为2的幂:

[Flags]
public enum animals : int
{
    None = 0,
    Cat = 1,          // 2^0
    Dog = 2,          // 2^1
    Mouse = 4,        // 2^2
    Rat = 8,          // 2^3
    Lizzard = 16      // 2^4
}

若无法修改原有枚举(比如已保存历史数据),则只能基于现有值判断,但会存在歧义风险(比如res_flags=3无法区分是勾选了Mouse,还是同时勾选了Cat和Dog)。


不管是修正后的枚举,还是你坚持使用原有枚举,窗口启动时都可以通过位与操作判断每个复选框的勾选状态:

// 假设res_flags是从存储中读取的int值
this.chbCat.IsChecked = (res_flags & (int)animals.Cat) != 0;
this.chbDog.IsChecked = (res_flags & (int)animals.Dog) != 0;
this.chbMouse.IsChecked = (res_flags & (int)animals.Mouse) != 0;
this.chbRat.IsChecked = (res_flags & (int)animals.Rat) != 0;
this.chbLizzard.IsChecked = (res_flags & (int)animals.Lizzard) != 0;

逻辑很简单:位与操作会保留res_flags中与目标枚举值对应的二进制位,如果结果不为0,说明该位被设置过,即对应的复选框之前处于勾选状态。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:07:45