首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C#中的值中解码位掩码

从C#中的值中解码位掩码
EN

Stack Overflow用户
提问于 2014-12-04 12:58:21
回答 2查看 4.2K关注 0票数 6

我正试着破解一个比特掩码

代码语言:javascript
复制
[Flags]
public enum Amenities
{
    BusinessCenter = 1,
    FitnessCenter = 2,
    HotTub = 4,
    InternetAccess = 8,
    KidsActivities = 16,
    Kitchen = 32,
    PetsAllowed = 64,
    Pool = 128,
    Restaurant = 256,
    Spa = 512,
    Whirlpool = 1024,
    Breakfast = 2048,
    Babysitting = 4096,
    Jacuzzi = 8192,
    Parking = 16384,
    RoomService = 32768,
    AccessibleTravel = 65536,
    AccessibleBathroom = 131072,
    RollShower = 262144,
    HandicappedParking = 524288,
    InRoomAccessibility = 1048576,
    AccessibilityDeaf = 2097152,
    BrailleSignage = 4194304,
    FreeAirportShuttle = 8388608,
    IndoorPool =  16777216,
    OutdoorPool = 33554432,
    ExtendedParking = 67108864,
    FreeParking = 134217728
}

我如何编写一个函数来解码像5722635这样的值,并返回5722635编码的所有便利设施的列表。

结果应该如下所示:

该物业有以下便利设施:

  • 商务中心
  • 健身中心
  • 因特网接入
  • 现场提供水疗中心
  • 保姆
  • 停车
  • 可达的旅行路径
  • 无障碍浴室
  • 无障碍淋浴
  • 室内无障碍
  • 盲文或凸起标志

我一直在尝试这样的事情

代码语言:javascript
复制
public List<Amenities> Decode(long mask)
        {
            var list = new List<Amenities>();
            for (var index = 0; index < 16; index++)
            {
                var bit = 1 << index;
                if (0 != (bit & mask))
                {
                    list.Add(new Amenities(index));
                }
            }
            return list;
        }

但不能让它起作用。如能就如何妥善开展这项工作提出任何建议,将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-04 13:04:59

一条线怎么样?

代码语言:javascript
复制
var mask = (Amenities)5722635;

var result =
    Enum.GetValues(typeof(Amenities))
        .Cast<Amenities>()
        .Where(value => mask.HasFlag(value))
        .ToList();

您可以缓存Enum.GetValues(typeof(Amenities)).Cast<Amenities>()的结果以提高性能。

票数 13
EN

Stack Overflow用户

发布于 2014-12-04 13:09:22

首先,您的方法接受一个long,但是您的枚举隐式地使用int作为底层数据类型。要么将值存储为int,要么将枚举中的基础数据类型更改为long[Flags] public enum Amenities : long { ... }

其次,如果您的枚举被标记为FlagsAttribute,则实际上不需要将值转换为值列表,则可以使用Enum.HasFlag()方法检查标记的值。您必须先将long类型转换为Amenities类型:

代码语言:javascript
复制
var amenities = (Amenities)mask;

if (amentities.HasFlag(Amenities.BusinessCenter)) { ... }

但是,如果你真的想把这个旗子分成一系列的便利设施,那么:

代码语言:javascript
复制
public IList<Amenities> Decode(long mask)
{
        var amenities = (Amenities)mask;
        var list = new List<Amenities>();

        foreach (Amenities amenity in Enum.GetValues(typeof(Amenities))
        {
            if (amenities.HasFlag(amenity))
                list.Add(amenity);
        }

        return list;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27294690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档