为什么使用标志+位掩码而不是一系列布尔值?
鉴于我有一个对象可能处于一个或多个真/假状态的情况,我总是对为什么程序员经常使用flags +位掩码而不是使用多个布尔值有点模糊。
它遍布.NET框架。 不知道这是否是最好的例子,但.NET框架具有以下内容:
public enum AnchorStyles
{
None = 0,
Top = 1,
Bottom = 2,
Left = 4,
Right = 8
}
所以给定一个锚样式,我们可以使用位掩码来找出哪些状态被选中。 但是,您似乎可以使用为每个可能的值定义的bool属性或单个枚举值数组的AnchorStyle类/结构完成相同的操作。
当然,我的问题的主要原因是,我想知道我是否应该使用自己的代码进行类似的练习。
那么,为什么要使用这种方法?
传统上这是减少内存使用量的一种方法。 所以,是的,它在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?