【问题标题】:Bitvector32 and Bitarray in C#C# 中的 Bitvector32 和 Bitarray
【发布时间】:2012-05-30 16:51:45
【问题描述】:

我想知道 Bitvector32 是否有在 O(1) 时间内运行的位运算符。我目前正在使用大尺寸的 BitArray,并使用在 O(bitarray 的大小)中运行的 Bitwise And、Or 和 Not。

我在互联网上搜索了这个,但找不到答案。希望这里的人能帮忙!

【问题讨论】:

    标签: c# bitarray bitvector


    【解决方案1】:
    • 将 BitVector32 转换为 int 是一个 O(1) 操作。 (reference)
    • 将 int 转换为 BitVector32 是一个 O(1) 操作。 (reference)
    • 对 int 执行按位运算是 O(1) 运算。

    因此,

    var vectorAnd = new BitVector32(vector1.Data & vector2.Data);
    var vectorOr = new BitVector32(vector1.Data | vector2.Data);
    var vectorNot = new BitVector32(~vector1.Data);
    

    都是 O(1) 操作。

    【讨论】:

    • 但是由于尺寸的扩展,我开始使用 BitArray....有什么办法可以使用具有更多位数的 Bitvector32。任何结构实现,或更高长度的位向量,在按位运算中仍为 O(1)
    • @Dynamite:我认为您所要求的(对 O(1) 中的 unbounded 位数执行按位运算)是不可能的。请注意,O(1) 或 O(n) 并没有说明性能,只是说明了复杂性。所以,如果 BitArray 真的 是您的应用程序的瓶颈,我真的会敦促您测量(如果是,在 uint64 上使用本机操作可能是最快的方法去)。
    【解决方案2】:

    鉴于 BitVector32 始终是 32 位,因此没有可说的大小变化 - 那么如何根据数据大小来表示任何操作?

    就我个人而言,我从来没有发现BitVector32 是一种非常令人愉快的类型——我通常会坚持使用UInt32 来表示32 位,并使用普通的&| 等运算符。

    如果您正在考虑用一堆 BitVector32 值替换您的 BitArray,那最终仍然会使每个操作 O(n)。基本上很难避免这种情况,除非您实际存储原始值和操作,推迟操作的实际应用 - 这将更加更加复杂,并且只有在您只访问时才能使事情变得更好结果的一小部分。

    【讨论】:

    • 但是由于尺寸的扩展,我开始使用 BitArray....有什么办法可以使用具有更多位数的 Bitvector32。任何结构实现,或更高长度的位向量,在按位运算中仍为 O(1)。
    • @Dynamite:不。对于任意大小来说,这是不合逻辑的。您可以轻松实现更大但固定大小的位向量,例如BitVector64,BitVector128 具有恒定时间操作,但你不能让它任意扩展并且仍然具有恒定时间 - 除非推迟计算,正如我所说,只有在你实际上不使用大部分结果时才会有所帮助。哎呀,只是复制位不会是一个恒定时间的操作。
    • 如何创建更大尺寸的位向量..say Bitvector128
    • BitVector32 太笨拙了,真可惜。此外,无论我如何尝试使用它,它总是比手动摆弄 UInt32 慢。
    • BitVector32 简直太慢了,就像上面说的,使用 uint 并自己做。一个简单的基准测试显示 uint = 1715ms,BitVector32 = 4447ms,它将执行 1.000.000 次读取和写入。这是一个很大的不同。
    猜你喜欢
    • 2016-11-27
    • 2011-11-16
    • 2016-11-01
    • 2018-08-30
    • 2017-11-16
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多