我可以在位掩码中包含多少选项?



在这个问题中,有人指出:

使用int [for位掩码]是自找麻烦

我一直在使用unsigned char来存储位掩码标志,但我想到我会达到低限制,因为一个字符只是一个字节,因此8位,因此在我的掩码中只有8个选项?

enum options{
 k1=1<<0,
 k2=1<<1,
  .... through to k8
 }
 unsigned char myOption=k2;

我是否只需要使myOptionint或其他类型,例如,如果我希望它存储超过8个可能的选项(和选项的组合,当然,因此为什么我首先使用位掩码)?哪种类型最好?

如果您需要一个未知数量的'位',您可以使用类似std::vector<bool>类的东西,参见这里:

http://www.cplusplus.com/reference/vector/vector-bool/

这是vector类的专门化,它可以使用位来打包bool值,因此它比bool s数组的空间效率更高(是否需要额外的效率取决于您)。

当然我不知道你的应用程序是什么,有很多有效的理由使用位域。如果你只是简单地存储一堆真值和假值,那么像bool数组或bool向量这样的东西可能更容易维护(当然,它也有缺点,你不能像使用掩码和位域那样测试是否在一次操作中设置了3位,所以它是特定于应用程序的)。

我认为

vector<bool>是有争议的。参见:http://howardhinnant.github.io/onvectorbool.html

#include <stdint.h>

这定义了与编译器无关的固定大小的类型。

int16_t = 16 bits

uint16_t = 16 bits unsigned

int32_t = 32位

如果你需要超过64个标志,你应该考虑Wayne Uroda建议的::std::vector<>

最新更新