位操作-在c#中存储长二进制(最多512位)的最佳方式
本文关键字:512位 最多 方式 最佳 二进制 存储 位操作 | 更新日期: 2023-09-27 18:01:32
我正试图找出在c#中存储大二进制(超过96位)数字的最佳方法
我正在构建将自动分配轮班工人的应用程序。轮班时间可以短至15分钟(但将来可能会更短)。为了避免员工重复预约,我计划对他们的日常时间做一个二进制图:将24小时分成相等的时间段(15分钟),每个时间段都有一个标志(0代表空闲,1代表忙碌)。所以当我们尝试给一个工人另一个班次时,我们可以对工人的日常可用性和班次时间进行二元比较。简单容易决定。
但是c# long只允许最多64位,而根据目前的设置,我至少需要96位(每周期24小时* 60分钟/15分钟)。这种表示必须是内存友好的,因为一次将操作大约一百万个对象。
我考虑了几个其他的选择:
- 字符串。内存消耗大,不容易实现逐位操作
- 位数组。但是据我所知c#没有位类型
- 无符号整数数组。每个数组只代表一天的一部分。我能想到的最好的
还有其他建议吗??
提前感谢!
你看过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 mB的数组空间和你的代码?
我能看到的使用位向量的一个很好的借口是与执行时间成本有关。如果你的调度算法本质上是将一个员工位向量与另一个员工位向量进行比较以寻找冲突,并且在大规模上这样做,位向量可能会将计算时间减少大约10倍(每个员工使用两个*长*s来获得96位)。我会等到我的算法工作了再担心这个
您可以使用字节数组。我认为没有任何语言支持位数组,因为字节是内存中最小的可寻址块。其他选项是一个布尔值数组,但我相信每个布尔值无论如何都是作为一个字节存储的,因此会浪费内存,但它可能更容易使用。这真的取决于你要工作多少天。您也可以只存储班次的开始和结束时间,并使用其他方法来确定是否有重叠的时间表。这可能是最有意义的,也是最容易调试的。
BitArray
已经提到过,它使用了一个int
数组,就像您计划的那样。这也意味着它增加了一个额外的间接层(和一些额外的字节);它还做了大量的检查,以确保在操作两个位数组时,它们的长度是相同的。所以我会小心对待他们。它们很简单,但是比必要的要慢——对于较小的位数组,差异尤其大(与自己处理数组相比)。