【问题标题】:C#: is bitvector32 more efficient than bool for flags?C#:对于标志,bitvector32 比 bool 更有效吗?
【发布时间】:2019-08-09 06:11:55
【问题描述】:

bool 需要 8 位来存储标志:true 或 false。 Bitvector32 允许您以 32 位存储 32 个标志。所以 32 个布尔标志将是 256 位。

不过……

Bitvector32 要求您为要寻址的每个位声明一个整数掩码。该掩码是一个整数,或 32 位 -- 32 个掩码乘以 32 位 + 32 位向量 32 位 = 32 个标志的 1056 位。

如果位掩码超过了标志的有效存储,那么 bitvector32 的意义何在?

【问题讨论】:

  • 我投票决定重新开放,因为这个问题是基于一个错误的前提,对于BitVector32 的意义实际上并不是一个意见问题。
  • 我非常希望,并期望我的理解是有缺陷的。我不是在宣传意见,而是提出我的(有限的)理解以寻求更准确的理解。如果这个问题是基于一个错误的前提,我想知道错误在哪里。谢谢。
  • 您的问题中至少有两个错误前提:bool 类型在 C# 中需要 32 位,而不是 8 位。此外,无论您如何存储位标志,您都需要知道 which bitwhich flag 搭配。 BitVector32 类型不会添加到此;这与任何基于位的标志实现的要求相同。 BitVector32 类型只是让操作更方便(而且就我个人而言,我不相信它更方便......处理位标志并不难开始)。

标签: c# performance flags


【解决方案1】:

如果我需要同时测试多达 32 个标志,那么 BitVector32 的效率要高得多:

if (bv & 0X...) ...

将测试几个“开启”的标志。

if ((bv & 0X...) == 0) ...

测试所有关闭的指定标志。

如果我有十亿个标志,我宁愿使用 div 和 mod 32 来找到要使用的位向量——而不是使用大量 RAM。

(其实我可能会用long或者longlong,不会理会BitVector。)

OTOH,对于几个标志,我可能会使用 1 字节的东西。浪费几个字节,但速度更快。

如果我需要是/否/也许,一点都不行。 (同样适用于 M/F/...)

【讨论】:

    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多