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

鉴于我有一个对象可能处于一个或多个真/假状态的情况,我总是对为什么程序员经常使用flags +位掩码而不是使用多个布尔值有点模糊。

它遍布.NET框架。 不知道这是否是最好的例子,但.NET框架具有以下内容:

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

所以给定一个锚样式,我们可以使用位掩码来找出哪些状态被选中。 但是,您似乎可以使用为每个可能的值定义的bool属性或单个枚举值数组的AnchorStyle类/结构完成相同的操作。

当然,我的问题的主要原因是,我想知道我是否应该使用自己的代码进行类似的练习。

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

  • 内存消耗更少? (它看起来好像不会比bools的数组/结构少)
  • 比结构或数组更好的堆栈/堆性能?
  • 更快的比较操作? 更快的增值/删除?
  • 编写它的开发人员更方便吗?

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

    作为一种编程技术,它可能在今天的系统中已经过时了,你可以使用一组布尔,但是......

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

    它使用的内存少得多。 将所有4个示例值放入一个位掩码将使用半个字节。 使用一个布尔数组,最有可能会使用几个字节的数组对象加上每个布尔长字。 如果你必须存储一百万个值,你会明白为什么一个位掩码版本更好。

    它更容易管理,你只需要处理一个整数值,而一个bools数组在数据库中存储的方式会完全不同。

    而且,由于内存布局,在各个方面比阵列快得多。 它几乎与使用单个32位整数一样快。 我们都知道,就数据操作而言,速度一样快。


  • 轻松设置任意顺序的多个标志。

  • 易于保存并获得一系列0101011到数据库。


  • 除此之外,它更容易为位域添加新的位含义,而不是将新的布尔值添加到类中。 它也比一系列布尔值更容易将位域从一个实例复制到另一个实例。

    链接地址: http://www.djcxy.com/p/54417.html

    上一篇: Why use flags+bitmasks rather than a series of booleans?

    下一篇: Enum type constraints in C#