标签: bitset

将二进制文件读入位集或向量<bool>

如何将二进制文件读入bitsetor vector<bool>?二进制文件的长度会有所不同。有更好的容器吗?尽管我是一名经验丰富的程序员,但我还是 C++ 新手。

c++ binary bitset

5
推荐指数
1
解决办法
1758
查看次数

在 CUDA 中模拟 std::bitset

我有一个提供给内核的输入数组。每个线程都使用数组的一个值,并且根据规则要么更改该值,要么根本不更改它。

我想很快地找出输入内存中是否有任何变化,如果有的话,我想很快地找到这个变化发生的地方(输入数组的索引)。

我想到使用类似位数组的东西。位的总数将等于线程的总数。每个线程只能操作一位,因此最初这些位将设置为 false,如果线程更改相应的输入值,则该位将变为 true。

为了使它更清楚,我们假设我们有这个输入数组称为A

1 9 3 9 4 5
Run Code Online (Sandbox Code Playgroud)

位数组如下

0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

因此我们将有 6 个线程处理输入数组。假设最终的输入数组是

1 9 3 9 2 5
Run Code Online (Sandbox Code Playgroud)

所以最终的位数组将是:

0 0 0 0 1 0
Run Code Online (Sandbox Code Playgroud)

我不想使用数组,bool因为每个值都会占用 1 个字节的内存,这相当多,因为我只想使用位来工作。

有可能实现这样的目标吗?

我想创建一个char数组,其中数组的每个值都有 8 位。但是,如果两个线程想要更​​改数组第一个字符的不同位怎么办?即使位内的更改将位于不同的位置,他们也必须以原子方式执行操作。因此,使用原子操作可能会破坏并行性,在这种情况下,不需要使用原子操作,它没有任何意义,但必须使用,因为使用字符数组而不是更专门的东西的限制像一个std::bitset

先感谢您。

cuda gpu bit bitset

5
推荐指数
1
解决办法
2765
查看次数

如何查询 C++ std::bitset 中是否设置了某个范围内的任何位?

我正在寻找一个 C++ 位集实现,它可以回答是否在一个范围内设置了一个位。 std::bitsetvectorboost::dynamic_bitset都可以访问我可以循环的各个位,但这不是查询一系列位以询问是否设置了任何位的最有效方法 - 我不这样做甚至不需要知道是哪一个。

bitset b;
if(b.any(33, 199))
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

有提供这个的图书馆吗?我想针对其他实现(包括我可能必须编写的实现)运行一些基准测试,但我找不到任何似乎实现此功能的基准。

c++ bitset

5
推荐指数
1
解决办法
1502
查看次数

如何获取具有不同位集大小的位集 OR

当我使用时,

  std::bitset<5> op1 (std::string("01001"));
  std::bitset<5> op2 (std::string("10011"));

  std::cout << (op1|=op2) << std::endl;  
Run Code Online (Sandbox Code Playgroud)

显然一切都很好。

但我的问题是,如何使用两个不同大小的“std::bitset”进行 OR 运算?例如,

  std::bitset<11> op1 (std::string("101110011"));
  std::bitset<5> op2 (std::string("01001"));

  std::cout << (op1|=op2) << std::endl;
Run Code Online (Sandbox Code Playgroud)

我无法在 VS 2012 中编译此代码。我在这里错过了什么?我不能使用不同大小的位集进行“或”运算(以及“异或”运算)吗?这是平台特定的问题吗?

c++ binary bit bitset

5
推荐指数
1
解决办法
2906
查看次数

从位集创建单色 BMP

我可能需要一些帮助来弄清楚如何喂养下面的过程。我需要编写一个单色 BMP 文件。下面的代码(来自:How to Save monochrome Image as bmp in windows C++ ?)看起来能够做到这一点。我现在陷入了如何将 astd::bitset或 最好转换boost::dynamic_bitset成这种byte*格式的困境。到目前为止我的所有尝试都失败了,我无法将 8x8 棋盘格图案之类的东西写入 BMP 中。该程序创建了BMP,并且可以被Photoshop读取,但内容很乱。因此,任何如何解决此问题的建议都将受到赞赏!

Save1BppImage(byte* ImageData, const char* filename, long w, long h){

    int bitmap_dx = w; // Width of image
    int bitmap_dy = h; // Height of Image

    // create file
    std::ofstream file(filename, std::ios::binary | std::ios::trunc);
    if(!file) return;

    // save bitmap file headers
    BITMAPFILEHEADER fileHeader;
    BITMAPINFOHEADER * infoHeader;
    infoHeader = (BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER) );
    RGBQUAD bl = …
Run Code Online (Sandbox Code Playgroud)

c++ monochrome bitmap bmp bitset

5
推荐指数
1
解决办法
6285
查看次数

Java 从 BigInteger 到 BitSet 并返回

Java 8下面的代码中,将整数转换3为位集并打印{0, 1},这意味着 的位表示3在位置上有 1 0111

System.out.println(BitSet.valueOf(new long[]{3}));
Run Code Online (Sandbox Code Playgroud)

我有兴趣将具有大值的BigIntegeror转换为相应的值,然后再返回 - 让对象(位表示)将其转换为( )。我还想知道对于各种整数值,哪种表示形式占用更多内存?long10000000BitSetBitSetBigIntegerlong

java bitset bigint

5
推荐指数
1
解决办法
4464
查看次数

对于每个单独的线程一次写入的位集单独位线程是否安全?

我想知道如果我们对一条口号甚至 64 位字长进行操作,我可以同时对位集中的各个位进行操作吗?假设我有 10 个线程,每个线程都有threadId. 所有线程可以同时设置吗bits[threadId] = value

c++ concurrency bitset c++11

5
推荐指数
1
解决办法
2024
查看次数

如何访问位集中的位范围?

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

我想做的是将其写入文件。但是使用.to_string()实际上冻结了我的计算机。

我想做的是迭代这些位并一次取 64 位,将其转换为 auint64然后将其写入文件。

但是我不知道如何访问位集的不同范围。我该怎么做?我是 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;
}
Run Code Online (Sandbox Code Playgroud)

输出

10000110011010100111011101011011010101011010110011
0x7ffe8aa2b090                                                                                                                          
0x7ffe8aa2b098
17736
Run Code Online (Sandbox Code Playgroud)

每次运行的最后一个数字似乎都发生了变化,这不是我所期望的。

c++ bitset std-bitset

5
推荐指数
1
解决办法
3465
查看次数

如何将数据插入 PostrgeSQL BIT VARYING 列

在我的 Spring Boot 应用程序中,我需要将位掩码存储到表列中,目的是对该列执行按位查询。

我有一个域类,其中包含一个 Long id 字段和一个包含位掩码的掩码字段。我无法弄清楚如何将它映射到包含自动生成的长“id”列和 BIT VARYING (100)“掩码”列的表。

我正在使用默认的 Hibernate 映射。当我在 Java 中将掩码定义为字符串时,出现“PSQLException:列“掩码”的类型位不同,但表达式的类型为字符不同”错误。

当我将掩码定义为 Java BitSet 时,PostgresSQL 仅针对 bytea Postgres 类型给了我一个类似的错误。

有没有办法将 Java 字段映射到 BIT VARYING 字段?可以使用默认持久性来完成吗?或者我是否必须覆盖 CRUD 方法才能在 BIT VARYING 和某些 Java 类型之间进行转换?

java postgresql hibernate bitset spring-data

5
推荐指数
0
解决办法
163
查看次数

从十进制转换的二进制中删除前导零

我正在解决一个问题,我必须将给定的前 N ​​个自然数转换为二进制数。我正在使用bitset.to_string()。但是,在数字转换为二进制后,它有一些前导零显然等于给定位集的大小。任务是删除它。我已经做到了,std::string:: erase()但我认为这样做不是一个好方法。如何优化这部分代码?

#include <iostream>
#include <bitset>
#include <string>
int main()
{
    int T;
    std:: cin >> T;
    while(T--) {
    int n;
    std:: cin >> n;
    for(auto i = 1; i <= n; ++i) {
        std::string binary = std::bitset<32>(i).to_string(); //to binary

        //This part here

        int j = 0;
        while(binary[j] == '0') {
            ++j;
        }
        binary.erase(0, j);

        //Till here

        std::cout<<binary<<" ";
    }
    std:: cout << std:: endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ string binary loops bitset

5
推荐指数
1
解决办法
1805
查看次数