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

Algorithm 仅使用10000位表示10000个布尔值,algorithm,bit,Algorithm,Bit,我想表示10000位的信息(每一位可以是一位,也可以是零位)。我有什么办法可以做到这一点吗 维基百科解释了如何实现这一点。但它要求我有一个2^10000的数字来存储10000位 有没有哪种方法即使是存储大量的位也是可以处理的?正如维基百科所解释的,位字段在这里是一个合适的选择。可容纳10000位的位字段有2^10000个状态 这样做的一个很好的选择(考虑到整数是32/64位)是位向量,这里会详细询问并解释它: 一般的想法是使用整数数组作为位字段。您是否担心访问位号n需要移位n次?如果是这样,你

我想表示10000位的信息(每一位可以是一位,也可以是零位)。我有什么办法可以做到这一点吗

维基百科解释了如何实现这一点。但它要求我有一个2^10000的数字来存储10000位


有没有哪种方法即使是存储大量的位也是可以处理的?

正如维基百科所解释的,位字段在这里是一个合适的选择。可容纳10000位的位字段有2^10000个状态

这样做的一个很好的选择(考虑到整数是32/64位)是位向量,这里会详细询问并解释它:


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

您是否担心访问位号
n
需要移位
n
次?如果是这样,你可以通过使用一个字符数组将你的10000位分成10000/8个桶来处理问题(假设这里是C或C++)。现在,您可以通过计算位在哪个存储桶中(
n/8
)以及存储桶中的位置(
n%8
)来访问位号
n
)。然后你就做掩蔽。不需要额外的存储(除了结尾的填充,因此如果没有32位的完美倍数,则需要额外的一些位)。

您可以使bool例如,如果您有一组位,例如在结构中,则以1位为例,如下所示:

结构A { 布尔a:1,b:1,c:1,d:1,e:1; };


如果变量的数量很大,上述方法将不会有用。因此,创建一个大小为10000/4*8的整数数组。它将创建正好10000位。现在你可以使用偏移量和>访问每个位(比如访问第五十五位,使用55/4(8×1)和55%×32。你可以达到这个位。C++中的

< P> >你可以非常简单地使用两个标准库容器之一:

std::vector
标准向量的这种特殊化作用(几乎)与任何其他向量一样,但将其内容压缩到每个元素一位。除了享受这一事实,你还可以把它当作一个向量:

// 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.
//创建一个包含10000个布尔值的向量
std::向量块(10000位);
//将所有奇数设置为true
对于(int i=1;i
std::位集

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

您不能询问实现细节并指定“语言无关”。32位机器上用作位字段的整数可以包含32位。所以一个32个整数的数组可以容纳1024位…@harold我基本上是在要求一个算法。该算法不应该使用任何特定于语言的结构。@antlersoft一个由32个整数组成的数组本身使用32*4*8位。这并不是一个与语言无关的问题。在某些语言中,您可以简单地声明一个压缩布尔数组。在其他情况下,你必须做自己的事情。至于不使用任何“特定于语言的结构”,那是不可能的;在某些语言中,整数的位运算是唯一合理的方法,但它们是特定于语言的,因为并非所有语言都提供它们。一个常见的选择是使用字符数组作为位字段,但这取决于您的编程环境。是的,但是索引很困难。您假设“整数”正好是32位。这甚至不适用于所有C.@Keith的实现,或者您可以使用“char”来实现更简单的实现好的,
char
中有多少位?字符是有符号的还是无符号的?这两种答案甚至在符合标准的C实现中也有所不同。试图使之成为“语言不可知论者”更为困难。当你使用位智能时,这并不重要。字符始终使用8位。如果您想要完全的可移植性,请使用
Char\u位
而不是
8
——并使用
无符号字符
而不是普通的
Char
,后者可以是有符号的,也可以是无符号的。