为什么使用标志+位掩码而不是一系列布尔值?

2024-03-27

考虑到我有一个对象可能处于一个或多个真/假状态,我一直有点模糊为什么程序员经常使用标志+位掩码而不是只使用几个布尔值。

一切都在 .NET 框架上。不确定这是否是最好的示例,但 .NET 框架具有以下内容:

public enum AnchorStyles
{
    None = 0,
    Top = 1,
    Bottom = 2,
    Left = 4,
    Right = 8
}

因此,给定锚点样式,我们可以使用位掩码来确定选择了哪些状态。但是,似乎您可以使用 AnchorStyle 类/结构来完成同样的事情,其中​​为每个可能的值定义 bool 属性,或者单个枚举值的数组。

当然,我的问题的主要原因是我想知道我是否应该对我自己的代码遵循类似的做法。

那么,为什么要使用这种方法呢?

  • 内存消耗更少? (它没有seem就像它消耗的数量少于布尔数组/结构)
  • 堆栈/堆性能比结构体或数组更好?
  • 比较操作更快?更快的增值/减值?
  • 对于编写它的开发人员来说更方便吗?

传统上,这是减少内存使用的一种方法。所以,是的,它在 C# 中已经过时了:-)

作为一种编程技术,它在当今的系统中可能已经过时,并且您可以使用布尔数组,但是......

比较存储为位掩码的值的速度很快。使用 AND 和 OR 逻辑运算符并比较生成的 2 个整数。

它使用的内存要少得多。将所有 4 个示例值放入位掩码中将使用半个字节。使用布尔数组时,很可能会使用几个字节作为数组对象,并为每个布尔使用一个长字。如果您必须存储一百万个值,您就会明白为什么位掩码版本更优越。

它更容易管理,您只需要处理单个整数值,而布尔数组在数据库中的存储方式将完全不同。

而且,由于内存布局,在各个方面都比数组快得多。它几乎与使用单个 32 位整数一样快。我们都知道这是数据操作所能达到的最快速度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用标志+位掩码而不是一系列布尔值? 的相关文章