如果我有数字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() + "!");