65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (1投票)

2001年7月15日

2分钟阅读

viewsIcon

99084

downloadIcon

477

一个小型类, 用于在一个简单类中存储超过 32 个 1 位标志, 而不是使用最多 32 位的 DWORD

引言

你是否曾经遇到过这样的问题:你将位标志存储在一个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的跟踪机制(如果可用),并且可以非常容易地移植。

希望你能够完全使用这个在单个头文件中作为内联代码实现的小类。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.