c++ - 如何访问位集中的位范围?

标签 c++ bitset std-bitset

我有一个非常大的位集,比如说 100 亿位。

我想做的是将其写入文件。但是使用 .to_string() 实际上会卡住我的电脑。

我想做的是遍历位并一次取 64 位,将其转换为 uint64,然后将其写入文件。

但是我不知道如何访问位集的不同范围。我该怎么做?我是 c++ 的新手,不确定如何访问底层的 bitset::reference 所以请提供一个示例作为答案。

我尝试使用指针,但没有得到我期望的结果。这是我目前正在尝试的示例。

#include <iostream>
#include <bitset>
#include <cstring>
using namespace std;

int main()
{
    bitset<50> bit_array(302332342342342323);
    cout<<bit_array << "\n";
    bitset<50>* p;
    p = &bit_array;
    p++;
    int some_int;
    memcpy(&some_int, p , 2);
    cout << &bit_array << "\n";
    cout << &p << "\n";
    cout << some_int << "\n";

    return 0;
}

输出

10000110011010100111011101011011010101011010110011
0x7ffe8aa2b090                                                                                                                          
0x7ffe8aa2b098
17736

最后的数字似乎在每次运行时都会改变,这不是我所期望的。

最佳答案

程序中有几个错误。最大值bitset<50>可以容纳的是1125899906842623这比 bit_array 少得多已在程序中初始化。

some_int必须定义为 unsigned long并验证是否unsigned long在您的平台上有 64 位。

之后,测试bit_array的每一位在一个循环中,然后执行适当的按位(或和移位)运算并将结果存储到 some_int 中.

std::size_t start_bit = 0;
std::size_t end_bit = 64;
for (std::size_t i = start_bit; i < end_bit; i++) {
    if (bit_array[i])
       some_int |= mask;
    mask <<= 1;
}

您可以更改 start_bit 的值和 end_bit适本地浏览大型位集。

参见 DEMO .

关于c++ - 如何访问位集中的位范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54358864/

相关文章:

c++ - 具有第二模板类型的部分模板特化

c++ - 为什么 void* 在 C++ 中确实不好?有哪些选择?

c++ - bitsets 二进制与运算

java.util.BitSet——set() 没有按预期工作

c++ - 计算多个 std::bitset<N> 中出现 1 的最快方法?

c++ - 宏中的宏

c++ - 在循环中放置 "delete"的位置

java - BitSet(JAVA) 在埃拉托斯特尼筛法的实现中抛出 outofBoundsException

c++ - 使用 std::bitset 时程序崩溃,但仅当使用 VC 2015 编译时

c++ - 将字符简单更改为其位表示