在C#中存储长二进制(最多512位)的最佳方法

我试图找出在C#中存储大二进制(超过96位)数字的最佳方法

我正在构建应用程序,它将自动为轮class分配工作人员。 换档时间可短至15分钟(但未来可能会更小)。 为了避免工人的双重预订,我计划得到他们每日时间的二进制映射:24小时以相等的块(15分钟)分开,每个块都有一个标志(0表示免费,1表示忙)所以当我们试图给另一个转移到工人,我们可以对工人的每日可用性与轮class时间进行二元比较。 简单易行。

但是C#long只允许最多64位,并且在当前设置下我需要至少96位(每个周期24小时* 60分钟/ 15分钟)。 这种表示必须是内存友好的,因为一次操作大约有一百万个对象。

我考虑的其他选择很少:

  • 串。 内存饥渴,实现逐位操作并不简单
  • 位数组。 但据我所知,C#没有位类型
  • 无符号整数数组。 每个数组仅代表一天的一部分。 我能想到的最好的

还有其他建议吗?

提前致谢!

你可以使用和字节数组。 我认为任何语言都不支持一个位数组,因为一个字节是最小的可寻址内存。 其他选项是一个布尔数组,但我认为每个布尔值都存储为一个字节,所以会浪费内存,但它可能更容易使用。 这真的取决于你将要工作多少天。 您也可以只存储class次的开始和结束,并使用其他方法来确定是否存在重叠的时间表。 这可能是最有意义的,也是最容易调试的。

你看过BitArray类了吗? 它应该是你正在寻找的。

试试以下,

.Net 4内置BigInteger类型

http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

关于代码项目的.Net 2项目http://www.codeproject.com/KB/cs/biginteger 。

另一种选择, http://www.codeplex.com/IntX/

除非你有数百万的员工都需要同时安排 ,否则我很想将你的96个布尔值存储为一个字符串数组,其中0表示“免费”,1表示“忙”。 索引/访问/更新简单。 其余的员工日程安排可以放在磁盘上的数据库行中,而您根本不关心“96兆字节”。

如果你能找到一个实现位数组的类,你可以使用它。 (您也可以轻松编写代码)。 但是空间真的很重要吗?

坦率地说,如果您的组织确实有一百万名员工要安排,那么您肯定能买得起一台可以容纳96 mBarrays以及其余代码的机器吗?

我可以看到使用位向量的一个好借口与执行时间成本有关。 如果您基本上调度算法并且将一个员工位向量与另一个员工位向量进行比较以查找冲突,并且大规模地执行此操作,则位向量可能会将计算时间减少大约10倍(每个员工使用两个*长* s)得到你的96位)。 在我担心这个问题之前,我会等到我的算法运行起来。

已经提到过BitArray ,它使用了一个int数组,就像你计划做的那样。 这也意味着它增加了一个额外的间接层(以及一些额外的字节); 它还可以在任何地方进行大量检查,以确保例如两个比特arrays的长度在对它们进行操作时是相同的。 所以我会小心他们。 它们很容易,但比必要的慢 – 与小型arrays相比,差异特别大(与自己处理数组相比)。

为什么不将它存储为long和int的结构? 为了更有效的内存对齐和更快的地址计算,您可以使用2个long的结构或具有双重元素的long数组