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

时间:2013-05-15 03:02:28

标签: c++

this question中指出:

  

使用int [for bit mask]会遇到麻烦

我一直使用unsigned char来存储位掩码标志,但是我发现我会达到下限,因为char只是一个字节,因此是8位,因此我的掩码中只有8个选项? / p>

enum options{
 k1=1<<0,
 k2=1<<1,
  .... through to k8
 }

 unsigned char myOption=k2;

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

2 个答案:

答案 0 :(得分:3)

如果您需要未知数量的“位”,可以使用类似std::vector<bool>类的内容,请参阅此处:

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

这是矢量类的特化,它可以使用位打包bool值,因此它比bool的数组更节省空间(无论你需要额外的效率取决于你)。 / p>

当然我不知道你的应用程序是什么,使用位域有很多正当理由。如果你只是存储了一堆真值和假值,那么类似bool数组或者这个bools 的向量可能更容易维护(当然它有缺点,你无法测试看看是否在一次操作中设置了3位,就像屏蔽和位域一样,所以它是特定于应用程序的。)

我认为,{p> vector<bool>有点争议。请参阅:http://howardhinnant.github.io/onvectorbool.html

答案 1 :(得分:2)

#include <stdint.h>

这定义了具有固定大小的类型,这些类型不是特定于编译器的。

int16_t = 16位

uint16_t = 16位无符号

int32_t = 32位

如果你需要超过64个标志,你应该考虑:: std :: vector&lt;&gt;正如Wayne Uroda所说。