在一个“标量”中存储超过 32 个 1 位标志





2.00/5 (1投票)
2001年7月15日
2分钟阅读

99084

477
一个小型类,
引言
你是否曾经遇到过这样的问题:你将位标志存储在一个WORD
中,并且快要达到16位的限制?然后你可能使用了double
字而不是一个字。但是,当你在32位系统上跨越32位边界时,你该怎么做?然后你必须使用其他方法来存储你的位。
几周前,我们的一位程序员遇到了这个问题。他来找我,问我如何处理这个问题。我告诉他构建一个类,该类提供所有可能对存储和请求标志有用的标准操作。
这些操作通常是C++的或、与、非和比较运算符。“你不需要比这更多了!”我告诉他。他不相信我,并丢弃了一些次要的、有分量的标志,以便为新的标志腾出空间。
好吧,我认为这离真正的解决方案还差得远!
幸运的是,几天前我也遇到了同样的问题。“这将是一个实现我的建议的好机会”,我心想。然后我就这么做了。
因此,这里是(非常小的)类,它可以动态地存储你可能需要的尽可能多的标志。最大的优点是,你无需像你可能想的那样更改你的代码。
那么你究竟需要做什么呢?
-
第一步是最耗时的:你需要将所有
UINT-
、WORD-
和DWORD
类型更改为新类(名为Flags
)的类型。以前
void foo( unsigned int flags );
操作后
void foo( Flags flags );
为了性能(
Flags
不是一个C++标量),你可以使用const
引用(如果可以)void foo( const Flags& flags );
-
下一步是改变你定义标志的方式
以前,你可能使用代码来定义一个使用最低位的标志
#define MYFLAG 0x00000001L
你们中的一些人可能已经经历过,以十六进制值形式给出的所有位可能很难管理。现在会稍微容易一些
#define MYFLAG Flags(0)
...设置最低位(位0)。你很快就会注意到,这是一种定义标志的更简单方法。
就是这样!如果你避免使用位移来管理你的标志并依赖于Flags
类,你可能没有任何问题。而且最好的:除了你的RAM的容量之外,你永远不必害怕达到最大标志数量的边界。
我还添加了一个名为debug()
的小跟踪方法。它使用MFC的跟踪机制(如果可用),并且可以非常容易地移植。
希望你能够完全使用这个在单个头文件中作为内联代码实现的小类。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。