c# - 从 C# 中的值解码位掩码

标签 c# bit bitmask bitflags

我正在尝试解码位掩码

[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 编码的所有便利设施的列表。

结果应该是这样的:

此属性具有以下便利设施:

  • 商务中心
  • 健身中心
  • 上网
  • 现场可用的水疗中心
  • 保姆
  • parking 位
  • 无障碍旅行路径
  • 无障碍浴室
  • 无障碍淋浴间
  • 室内无障碍设施
  • 盲文或凸起标牌

我一直在尝试类似的事情

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;
        }

但无法让它工作。 任何关于如何使这项工作正常工作的建议将不胜感激。

最佳答案

单行呢?

var mask = (Amenities)5722635;

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

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

关于c# - 从 C# 中的值解码位掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27294690/

相关文章:

c++ - IBM 单精度 float 据转换为预期值

Powershell Hex、Int 和 Bit 标志检查

c - 按位运算,位的打印取决于先放哪个putchar ...?

ios - Sprite Kit 中允许的 categoryBitMask 的最大数量是多少?

javascript - 位掩码和 javascript 的问题

c# - 从 C# 字典返回匹配项数

c# - QueryOver 上的 GroupBy SqlFunction

c# - 如何检测一个对象是否属于泛型 List 类型并转换为所需的类型?

c++ - C++ 中有趣的位掩码拼图

c# - 如何找到 PowerShell 静态类和方法?