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

时间:2011-07-09 01:18:13

标签: c# bit-manipulation bit

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

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

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

我考虑的其他选择很少:

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

还有其他建议吗?

提前致谢!

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

尝试以下,

.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/

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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