如果我有数字1、2、3、4、5和6,并且想要以最小的方式存储它们的某种组合,我该怎么做?

例如,我可能想存储1、4和5,或者可能存储2、4、5和6,甚至可能存储所有六个数字。我将始终至少需要存储一个号码。我想我可能已经看到通过移位完成此操作,但是我不完全了解它是如何工作的。物有所值,我的最终目标是节省绝对最大的空间,因为这些值需要存储在存储空间非常少的硬件设备上。

编辑----------------------------------------

感谢大家的所有很棒的建议。我只是想澄清一下,我的应用程序中的实现并不一定要尽可能地小,而只是我所理解的,并且对于后面出现的其他开发人员来说是有意义的。最重要的是能够以最小的方式表示这些值,因为我最终必须用其他几个值构建一个字节数组,并将其全部写入存储空间非常有限的设备中。再次感谢大家的出色建议!

最佳答案

[Flags]
public enum UIntEnum : byte
{
    None = 0x0,
    One = 0x1,
    Two = 0x2,
    Three = 0x4,
    Four = 0x8,
    Five = 0x10,
    Six = 0x20
};

public static class UIntEnumExtensions
{
    public static Boolean ContainsOne(this UIntEnum enum)
    {
        // For .NET < 4.0
        // return ((enum & UIntEnum.One) == UIntEnum.One);
        // For .NET >= 4.0
        return enum.HasFlag(UIntEnum.One);
    }

    public static Boolean ContainsTwo(this UIntEnum enum)
    {
        // For .NET < 4.0
        // return ((enum & UIntEnum.Two) == UIntEnum.Two);
        // For .NET >= 4.0
        return enum.HasFlag(UIntEnum.Two);
    }

    // And so on...

    public static List<UInt32> GetComponents(this UIntEnum enum)
    {
        List<UInt32> values = new List<UInt32>();

        if (enum.ContainsOne())
            values.Add((UInt32)1);

        if (enum.ContainsTwo())
            values.Add((UInt32)2);

        // And so on...
    }
}


然后,例如:

UIntEnum enum = UIntEnum.Two | UIntEnum.Six;

if (enum.ContainsSix())
    Console.WriteLine("Enum contains Six!");

foreach (UInt32 value in enum.GetComponents())
    Console.WriteLine("Enum contains " + value.ToString() + "!");

07-24 09:44
查看更多