C#将值存储在值中 - Bitmasks

时间:2013-02-26 10:50:06

标签: c# bit-manipulation bitmask

我正在开发一个包含某些类别的应用程序。目的是将类别存储在一个值中 首先,我选择将它们存储在一个int中 分类:0,1,2,3 ...
然后我做一个位掩码操作来查找选择了哪个类别 但问题是我无法存储更多的31个类别是这个int。

有没有办法制作这样的系统?我不想扔掉无限数量的类别,但可能超过64个 目标语言是C#,但任何其他解决方案都可以。

非常感谢!

4 个答案:

答案 0 :(得分:2)

考虑使用System.Collections.BitArray,它是一个任意长度的位数组。您可以执行交叉点(AND),联合(OR)和补充(NOT)。

现在,您可以使用整数键入超过32个类别:

public static class Categories
{
   public const int Category1 = 1;
   public const int Category2 = 2;
    //...
   public const int Category3123 = 3123;
   public const int Max = 5000;
}

BitArray myBitset = new BitArray((int)Categories.Max);
myBitSet.Set(Categories.Category1);
myBitSet.Set(Categories.Category4);

我使用int而不是枚举来避免使用BitArray时所需的所有强制转换,但显然你可以将它们封装在一个处理类别的类中。

答案 1 :(得分:1)

我不确定我是否正确理解了你的问题,所以这里有两个答案:

如果你想对一个对象进行分类,但它一次只能容纳一个 ,你可以完全选择将类别号存储在int中 - 不需要bitmasking。

如果要存储不同的标志/类别/选项,所有对于给定对象应该为true或false,那么您应该使用更长的位掩码。一个 bools数组是一个好主意 - 不需要做位操作来获取和设置值,我很确定编译器最好优化空间使用(因为你知道一个bool变量)实际上是一个字节但我认为如果你创建了许多bool变量,它们实际上会填充最小的空间。)无论如何,你总是可以选择自己的实现 long,即64位,甚至BigInteger - 无限数字位数,您最初必须将其设置为1 * 10 ^ x,其中x是您想要访问的大位位置的数字。

答案 2 :(得分:0)

如果你定义这样的类别:

public enum Categories
{
    Category1 = 0x0001,
    Category2 = 0x0002,
    Category3 = 0x0004,
    Category4 = 0x0008,
    Category5 = 0x000F,
    Category6 = 0x0010,
    Category7 = 0x0020,
    Category8 = 0x0040,
    // etc...
}

然后你可以像这样使用它们:

var myCategories = Categories.Category1 | Categories.Category4;

if(myCategories | Categories.Category1 > 0)
{
    // do something for category 1....
}

答案 3 :(得分:0)

你为什么在这里使用位掩码?存储效率是否存在首要问题?否则,只需使用HashSet类别。

从概念上讲,位集和传统集合容器是相同的,位集只是具有特殊性能特征的特定实现。

相关问题