仅使用10000位表示10000个布尔值

时间:2013-03-18 18:56:51

标签: algorithm bit

我想表示10000位信息。(每个可以是一个或零)。我有什么方法可以做到这一点吗?

维基百科解释a bit hack来实现这一目标。但后来它要求我有一个大到2 ^ 10000的数字来存储10000位。

即使存储大量的比特,还有某种方式易于处理吗?

4 个答案:

答案 0 :(得分:5)

正如维基百科所解释的那样,位字段是一个合适的选择。一个可以容纳10,000位的位字段有2 ^ 10000个状态。

这样做的一个很好的选择(假设整数是32/64位)是一个位向量,这里有一个令人难以理解的详细信息和解释:

bit vector implementation of set in Programming Pearls, 2nd Edition

一般的想法是你使用一个整数数组,用作位字段。

答案 1 :(得分:1)

你可以让 bool 取1位,例如,如果你有一堆,例如。在结构中,像这样:

结构A. {   bool a:1,b:1,c:1,d:1,e:1; };

如果变量数量很大,则上述方法将无用。因此,创建一个大小为10000/4 * 8的整数数组。它将精确创建10000位。现在,您可以使用offset和<<来访问每个位。或者>>(比如访问第55位,使用楼层(55/4 * 8)和>> 55%32。你可以到达那个位置。)

答案 2 :(得分:1)

在C ++中,您可以使用两个标准库容器中的一个来非常简单地执行此操作:

std::vector<bool>

标准向量的这种特化(几乎)与任何其他向量一样,但每个元素将其内容压缩为一位。除了享受这个事实,你可以像对待一样对待它:

// Create a vector of 10000 booleans
std::vector<bool> lots_of_bits(10000);
// Set all the odd ones to true
for (int i = 1; i < lots_of_bits.size(); i += 2) {
  lots_of_bits[i] = true;
}
// Add another 100 trues at the end
for (int j = 0; j < 100; ++j) {
  lots_of_bits.push_back(true);
}
// etc.

std::bitset<N>

“新的,改进的”位向量,它不会伪装成标准容器。特别是,它具有固定的大小,您需要在编译时知道大小。这可能有点限制,但它是一个非常有用的类。与std::vector<bool>类似,它实现[]运算符以获取和设置各个位。它还支持按位逻辑运算符&|,'^'和~(和,或者,xor和not),以及左右位移和其他一些实用程序

答案 3 :(得分:0)

您是否担心访问位号n需要转换n次?如果是这样,您可以使用字符数组将10,000位划分为10,000 / 8个桶(假设此处为C或C ++),从而使问题易于处理。现在,您可以通过确定该位(n)中的存储桶以及存储桶中的哪个位置(n / 8)来访问位号n % 8。然后你就做了掩饰。不需要额外的存储空间(除了最后的填充,如果你没有32位的完美倍数,那么一些额外的位)。